Android选择和取消选择适配器kotlin中的项目的问题?

我正在创建一个视图以分组的方式显示时间。 为此,我将项目分组在一个散列表中,并将其传递给活动。 从我的活动,我正在初始化父适配器以线性时尚显示列表。 在那个父适配器中,还有另一个子适配器,它具有时间项目,这些项目使用gridLayout管理器以网格方式显示。

当前场景的形象和问题如下: 在这里输入图像描述

现在的实际问题,我只想一次选择一次。 但是,正如你所看到的,不同的数组列表在这里有不同的选择。 当我从同一组中选择一个项目时,它工作正常。 但这并不是取消其他团体的时间。 我怎样才能做到这一点?

父适配器:

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) 

}

我的孩子Timeslots适配器 – >在这个适配器中,我写了一个代码来选择取消选择时间。 但是它只发生在同一个小组。

 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() } } } 

}

尝试与网格管理器一起使用一个适配器

 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 } } }); 

你也应该把你的两个适配器合并为一个。 与您的项目的散列表不同,使用排序列表项[标题,时间,时间,时间,标题,时间,时间,时间等]。 现在您可以简单地检查需要标记为选中的项目。