我在一个屏幕上工作,必须显示两次相同的项目集合。我正在使用两个RecyclerView
,每个具有相同的Adapter
除了屏幕上的两个RecyclerViews
外,我还有一个continue
按钮可以转到下一个屏幕。
我想在按钮上施加一些限制,以便如果用户未从每个RecyclerView
中选择一个项目,则该用户将无法进入下一个屏幕
当用户点击一个项目时,将调用以下方法。
fun setSelection(item: Item) {
list.forEach {
it.isSelected = false
if (it.id == item.id) it.isSelected = true
}
notifyDataSetChanged()
}
并且要验证列表中是否至少有一个选定的项目,我使用以下方法:
fun isAnySelected(): Boolean {
return list.any { item -> item.isSelected }
}
在按钮的clickListener
中,我添加了此验证:
if ((first_recycler.adapter as CustomAdapter).isAnySelected() &&
(second_recycler.adapter as CustomAdapter).isAnySelected())
{ //go to next screen }
else{
// select an item before continue }
我的问题是,如果我仅从一个RecyclerView
中选择一项,则当我点击continue
按钮时,它们两个都将返回true
。
为什么(second_recycler.adapter as CustomAdapter).isAnySelected()
仅返回true
(first_massage_display.mdl_recycler.adapter as MassageAdapter).setSelection(item)
被叫吗?
答案 0 :(得分:1)
每个适配器中的列表之类的声音都引用相同的列表项实例。这可能是因为您将相同的列表传递给了两个适配器,或者仅仅是因为您没有在每个列表中创建不同的列表项实例。如果两个列表引用相同的列表项,则更改一个列表中的列表项也会更改另一个列表中的列表项。
我建议将Item
设置为数据类,以便您轻松制作副本。然后,创建列表的副本,其中列表的每个成员也都将被复制,然后将其传递给第二个适配器。您可以使用map()
完成一次复制列表及其中所有项目的两个步骤:
val secondList = firstList.map(Item::copy)