kotlin - 适配器中的几个列表
问题描述
好吧,我有一个 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)
解决方案
好的,所以。您的问题是您的功能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;
}
}
推荐阅读
- asp.net - 部署到 Azure 后有关 Global.asax 问题的问题
- prolog - 域内实例化错误
- haskell - 为什么 GHCi 了解 GHC 不了解的导入?
- javascript - 根据条件不工作删除所有功能
- python - 向 CloudLoggingHandler 类提供“资源”参数不起作用
- angular - 如何对 nSwag Angular 客户端进行单元测试
- javascript - 怎么回到上一页,却不计算js中的url变量
- android - Android - Gradle 同步失败:org/jetbrains/kotlin/kapt/idea/KaptGradleModelorg/jetbrains/kotlin/kapt/idea/KaptGradleModel
- google-sheets - 根据 A 列中的值旋转 B、C 列等值
- javascript - 非贪婪的正则表达式误解,/\/.*?$/ 表现得像贪婪