¿Problema de Android en la selección y deselección de elementos en un adaptador kotlin?

Estoy creando una vista para mostrar el time de manera agrupada. Para eso, agrupé los elementos en un hashmap y los pasé a la actividad. De mi actividad, estoy inicializando el adaptador principal para mostrar la list de forma lineal. En ese adaptador padre hay otro adaptador hijo con elementos de time que se muestran usando gridLayout manager en forma de cuadrícula.

La Imagen del escenario actual y el problema es el siguiente: enter image description here

Ahora el problema real, quiero seleccionar solo 1 vez a la vez. Pero como puede ver, diferentes arraylists tienen diferentes selects aquí. Cuando selecciono 1 elemento del mismo grupo, funciona bien. Pero no está deseleccionando el time de otros grupos. ¿Cómo puedo lograr eso?

Adaptador para padres:

class TimePickerAdapter(context: Context, arrTimeSlots: ArrayList<ListItem>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { val mContext = context val mList = arrTimeSlots override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { return if (viewType == ListItem.TYPE_HEADER) { TimeHeaderHolder(LayoutInflater.from(parent?.context). inflate(R.layout.item_time_group, parent, false)) } else { TimeSlotsHolder(LayoutInflater.from(parent?.context). inflate(R.layout.item_time_child, parent, false)) } } override fun getItemCount() = mList.size override fun getItemViewType(position: Int): Int { return mList[position].type } override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { if (holder is TimeHeaderHolder) { holder.itemView?.apply { with(mList[position] as TimeHeaderItem) { tvTimeGroupHeader.text = date } } } else { holder?.itemView?.apply { with(mList[position] as TimeSlotItem) { val mAdapter = TimeSlotsAdapter(mContext, pojoOfTimeSlots) rvTimeSlotsChild.layoutManager = GridLayoutManager(mContext, 3) rvTimeSlotsChild.adapter = mAdapter } } } } inner class TimeHeaderHolder(itemView: View) : RecyclerView.ViewHolder(itemView) inner class TimeSlotsHolder(itemView: View) : RecyclerView.ViewHolder(itemView) 

}

Adaptador Timeslots de mi hijo -> En este adaptador, he escrito un código para seleccionar deseleccionar la hora. Pero está sucediendo solo para el mismo grupo.

 class TimeSlotsAdapter(context: Context, arrTimeSlots: List<TimeSlots>?) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { val mContext = context val mList = arrTimeSlots!! override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { return TimePickerHolder(LayoutInflater.from(parent?.context). inflate(R.layout.item_time_picker, parent, false)) } override fun getItemCount() = mList.size override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { holder?.itemView?.apply { with(mList[position]) { tvTimeView.text = convertedTime if (isSelected) { tvTimeView.background = ContextCompat.getDrawable(context, R.drawable.time_rounded_corner_selected) tvTimeView.setTextColor(ContextCompat.getColor(context, R.color.white)) } else { tvTimeView.background = ContextCompat.getDrawable(context, R.drawable.time_rounded_corner) tvTimeView.setTextColor(ContextCompat.getColor(context, R.color.grey_text_7)) } } } } inner class TimePickerHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { init { itemView.setOnClickListener { for (i in mList.indices) { mList[i].isSelected = false } mList[adapterPosition].isSelected = true notifyDataSetChanged() } } } 

}

Intenta usar un adaptador con el administrador de cuadrícula

 GridLayoutManager gridLayoutManager = new GridLayoutManager(getAppContext(), 3); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { //define span size for this position //for example, if you have 2 column per row, you can implement something like that: if(position == youRule) { return 3; // 3 item in row } else { return 1; // 1 item in row } } }); 

También deberías unir tus dos adaptadores en uno. A diferencia de hashmap para sus elementos, use el elemento de la list orderada [encabezado, hora, hora, hora, encabezado, hora, hora, hora, etc.]. Ahora puede verificar fácilmente qué elemento debe marcarse como seleccionado.