我在一个屏幕上工作,我必须显示两次相同的项目集合。我正在使用两个 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)
是叫什么?
听起来每个适配器中的列表都引用了相同的列表项实例。这可能是因为你向两个适配器传递了相同的列表,或者只是你没有在每个列表中创建不同的列表项实例。如果两个列表引用相同的列表项,那么在一个列表中改变一个列表项也会在另一个列表中改变它。
我建议将 Item
一个数据类,这样你就可以轻松地进行复制。然后创建一个列表的副本,其中列表的每个成员也被复制,并将其传递给第二个适配器。你可以使用 map()
一次完成复制列表和其中的项目的两个步骤。
val secondList = firstList.map(Item::copy)