2017-09-21 2 views
0

ich von Java Kotlin und erstellen Sie diese recyclerViewAdapter verschoben haben:Kotlin RecyclerViewAdapter IndexOutOfBoundException

class MisPedidosAdapter(private val context: Context, private var pedidos: List<ParseObject>?, private val onMisPedidosClickListener: OnMisPedidosClickListener) : CustomRecyclerViewAdapter() { 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { 

    when(getItemViewType(viewType)){ 
     STATIC ->return NoMisPedidosHolder(LayoutInflater.from(parent.context).inflate(R.layout.no_pedidos_recibidos_item, parent, false)) 
     else -> return MisPedidosHolder(LayoutInflater.from(parent.context).inflate(R.layout.mis_pedidos_item, parent, false), onMisPedidosClickListener, pedidos) 
    } 
} 

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { 

    if (getItemViewType(position) == STATIC) 
    { 
     val mHolder = holder as NoMisPedidosHolder 
    } 
    else 
    { 
     val mHolder = holder as MisPedidosHolder 

     val pedido = pedidos!![position] 
     val menuShop = pedido.getParseObject("menu_shop") 
     mHolder.numPlati.text = pedido.getNumber("quantity")?.toInt().toString() 
     mHolder.horario.text = pedido.getString("horario") 

     mHolder.dateOrder.text = StringUtils.getDataFormatted("dd MMM yyyy", pedido.createdAt!!) 

    } 
} 

override fun getItemViewType(position: Int): Int = when{ 
    pedidos!!.isEmpty() -> STATIC 
    else -> DINAMIC 
} 

override fun getItemCount(): Int = when{ 
    pedidos!!.isEmpty() -> 1 
    else -> pedidos!!.size 
} 

fun updatePedidos(pedidos: List<ParseObject>) { 
    this.pedidos = pedidos 
    notifyDataSetChanged() 
} 

companion object { 
    private val STATIC = 0 
    private val DINAMIC = 1 
} 
} 

das Problem ist, dass, wahrscheinlich, wenn ich list.size in Kotlin tun es enthält auch die Größe Index (zum Beispiel, wenn die Größe ist 4, es gilt {0,1,2,3,4}). Wenn ich für den Zyklus verwende, kann ich {0, 1, 2, 3} mit until sperren, aber in diesem Fall weiß ich nicht, wie es geht. Wer weiß einen Weg, um es zu lösen? Dank

+1

Gibt es einen Grund, warum Sie 1 zurückgeben, wenn Ihre Liste leer ist? –

+0

Ich poste zum Beispiel eine Nachricht mit "Keine Nachricht erhalten" @MuratK. – nani

Antwort

0

Verwendung dieses

override fun getItemCount(): Int = when{ 
    pedidos!!.isEmpty() -> 0 
    else -> pedidos!!.size 
} 

dieser insted

override fun getItemCount(): Int = when{ 
    pedidos!!.isEmpty() -> 1 
    else -> pedidos!!.size 
} 
+0

nein es ist richtig, denn wenn pedidos.size == 0, zeigt es eine andere Ansicht in den Adapter – nani

+0

@nani teilen Sie Ihr Crash-Protokoll mit Frage –

+0

Antwort ist richtig, weil Adapter Position 1 an onBindViewHolder Methode senden und Sie versuchen, das erste Element aus leeren Array: val pedido = pedidos !! [position] – Beyka

0

Sie haben

when(getItemViewType(viewType)){ 

mit

ersetzen
when(viewType){ 
+0

es funktioniert nicht, weil es getItemViewType – nani

+0

In der Tat benötigt, und 'viewType' ist das zweite Argument der Methode' onCreateViewHolder'. Die Methode 'getItemViewType' weist nur' position' auf 'viewType' zu. Bescheidene Frage: Haben Sie die Lösung versucht? – kujeensiti

+0

ja, aber das funktioniert nicht – nani

Verwandte Themen