Как воспроизвести эту ошибку. Я открываю и закрываю элементы внешнего RecyclerView и нажимаю на элементы внутреннего RecyclerView, и в какой-то момент возникает ошибка IndexOutOfBoundsException. Я думаю, что это происходит, потому что я перемещаю некоторый код из метода привязки ViewHolder в конструктор ViewHolder.
Исключение происходит во внутреннем Recycler View ServiceViewHolder, когда я нажимаю Это фрагмент кода, где возникает исключение
binding.mbExchange.setOnClickListener {
listener?.onItemClick(items[adapterPosition])
}
Внешний вид переработчика
class GroupAdapter @Inject constructor() : RecyclerView.Adapter<GroupAdapter.GroupViewHolder>() {
@Inject
lateinit var mDecimalFormat: DecimalFormat
val items = ArrayList<Pair<Group, List<Service>>>()
val icons =
arrayListOf(R.drawable.ic_globe_1, R.drawable.ic_envelope_1, R.drawable.ic_outgoing_call)
val viewPool = RecyclerView.RecycledViewPool()
var shouldShowButton = false
var progress: ObservableBoolean? = null
var listener: BaseViewHolder.ClickListener<Service>? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GroupViewHolder {
return GroupViewHolder(
ViewHolderBCGroupBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: GroupViewHolder, position: Int) {
holder.bind(items[position], icons[position % icons.size])
}
inner class GroupViewHolder : RecyclerView.ViewHolder {
private val binding: ViewHolderBeelineClubGroupBinding
private val adapter: ServiceAdapter
private val childLayoutManager: LinearLayoutManager
constructor(binding: ViewHolderBCGroupBinding) : super(binding.root) {
this.binding = binding
adapter = ServiceAdapter()
adapter.shouldShowButton = shouldShowButton
adapter.progress = progress
adapter.listener = listener
adapter.mDecimalFormat = mDecimalFormat
childLayoutManager = LinearLayoutManager(binding.root.context)
binding.rvServices.layoutManager = childLayoutManager
binding.rvServices.adapter = adapter
binding.rvServices.setRecycledViewPool(viewPool)
binding.root.context.getDrawable(R.drawable.divider_background)?.let {
RecyclerViewDivider.with(binding.root.context)
.drawable(it)
.hideLastDivider()
.build()
.addTo(binding.rvServices)
}
}
fun bind(item: Pair<Group, List<Service>>, icon: Int) {
binding.item = item.first
binding.ivIcon.setImageResource(icon)
//childLayoutManager.initialPrefetchItemCount = item.second.size
adapter.items.clear()
adapter.items.addAll(item.second)
adapter.notifyDataSetChanged()
binding.root.setOnClickListener {
item.first.isExpanded = !item.first.isExpanded
notifyItemChanged(adapterPosition)
}
}
}
}
Внутренний вид переработчика
class ServiceAdapter @Inject constructor() :
RecyclerView.Adapter<ServiceAdapter.ServiceViewHolder>() {
val items = ArrayList<Service>()
var shouldShowButton = false
var progress: ObservableBoolean? = null
var listener: BaseViewHolder.ClickListener<Service>? = null
var mDecimalFormat: DecimalFormat? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ServiceViewHolder {
return ServiceViewHolder(
ViewHolderBCServiceBinding.inflate(
LayoutInflater.from(
parent.context
), parent, false
)
)
}
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: ServiceViewHolder, position: Int) {
holder.bind(items[position])
}
inner class ServiceViewHolder : BaseViewHolder<Service> {
val binding: ViewHolderBeelineClubServiceBinding
constructor(binding: ViewHolderBCServiceBinding) : super(binding.root) {
this.binding = binding
this.binding.progress = progress
this.binding.mbExchange.visibility = if (shouldShowButton) View.VISIBLE else View.GONE
binding.mbExchange.setOnClickListener {
listener?.onItemClick(items[adapterPosition])
}
}
override fun bind(item: Service) {
binding.item = item
binding.tvPrice.text = "${mDecimalFormat?.format(item.price)} Beep"
}
}
}
трассировка стека
java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
at java.util.ArrayList.get(ArrayList.java:437)
at com.example.market.adapter.ServiceAdapter$ServiceViewHolder$1.onClick(ServiceAdapter.kt:47)
at android.view.View.performClick(View.java:6294)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)