首页 > 解决方案 > 适配器中的几个列表

问题描述

好吧,我有一个 Json,其中包含多个要在 recyclerView 中显示的数组,我曾考虑过从适配器访问 modelParent,但没有办法。

模型

class DetallesModelParent{

    var golesLocal: ArrayList<DetLocalModel>? = null       //3 items
    var golesVisitante: ArrayList<DetVisiModel>? = null    // 2 items
}

其他:

class DetLocalModel(
    val idJugador: String,
    val nombre: String,
    val minuto: String )

其他

class DetVisiModel(
    val idJugador: String,
    val nombre: String,
    val minuto: String
)

在活动中,所有内容都转到适配器以显示那里的所有内容:

    override fun onResponse(call: Call<DetallesModelParent>, response: Response<DetallesModelParent>) {
val golLocal = (response.body()!!)
Rv_DetLocal.adapter = DetLocalAdapter(golLocal!!)

和适配器:

class DetLocalAdapter(val det_partido: DetallesModelParent): RecyclerView.Adapter<DetLocalAdapter.ViewHolder>() {

    var listaLocal = ArrayList(det_partido.golesLocal)
    var listaVisi = ArrayList(det_partido.golesVisitante)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val layoutInflate = LayoutInflater.from(parent.context)
            .inflate(R.layout.partido_goles_row, parent, false)

        return ViewHolder(layoutInflate)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val itemDetPart = golesLocal[position]
        val itemDet = golesVisi[position]
        holder.bindItems(itemDet)
    }

    override fun getItemCount(): Int {
        return listaLocal.size + listaVisi.size
    }

    class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
        fun bindItems(plantillaModel2: DetallesModelParent){

            itemView.tv_JugadorLocal.text = plantillaModel2.golesLocal!!.get(adapterPosition).nombre
            itemView.tv_JugadorVisi.text = plantillaModel2.golesVisitante!!.get(adapterPosition).nombre

        }
    }
}

日志猫:

java.lang.IndexOutOfBoundsException:索引:3,大小:3 at java.util.ArrayList.get(ArrayList.java:437) at com.myapplication.Jornadas.DetPartidos.DetLocalAdapter$ViewHolder.bindItems(DetLocalAdapter.kt:39) at com.myapplication.Jornadas.DetPartidos.DetLocalAdapter.onBindViewHolder(DetLocalAdapter.kt:29) 在 com.myapplication.Jornadas.DetPartidos.DetLocalAdapter.onBindViewHolder(DetLocalAdapter.kt:12)

标签: kotlinadapterandroid-recyclerview

解决方案


好的,所以。您的问题是您的功能onBindViewHolder

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val itemDetPart = golesLocal[position]
    val itemDet = golesVisi[position]
    holder.bindItems(itemDet)
}

getItemCount使用以下实现将返回两个列表的大小。例如,5。所以,会有以下调用:

onBindViewHolder(holder, 0) // ok
onBindViewHolder(holder, 1) // ok
onBindViewHolder(holder, 2) // npe, as item visi has only 2 items.
onBindViewHolder(holder, 3)
onBindViewHolder(holder, 4)

当位置达到 3 NPE 将被抛出。为什么?因为通过您的 onBindViewHolder 实现,您尝试获取...的第 3 个元素。

所以,你需要告诉你应该在适配器位置绑定什么元素

例如:

override fun onBindVieHolder(holder: ViewHolder, position: Int) {
    if (position < itemDetPart.count()) {
        // bind the first list
        holder.bindItems(golesLocal[position])
        return
    } else {
        // bind the second one, but remember, that param position is an adapter position, so you have to fix it.
        holder.bindItems(golesVisi[position - goesLocal.count()])
        return;
    }
}

推荐阅读