适配器列表项更新问题

时间:2020-05-28 14:54:52

标签: android kotlin android-recyclerview adapter

我在一个屏幕上工作,必须显示两次相同的项目集合。我正在使用两个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)

被叫吗?

1 个答案:

答案 0 :(得分:1)

每个适配器中的列表之类的声音都引用相同的列表项实例。这可能是因为您将相同的列表传递给了两个适配器,或者仅仅是因为您没有在每个列表中创建不同的列表项实例。如果两个列表引用相同的列表项,则更改一个列表中的列表项也会更改另一个列表中的列表项。

我建议将Item设置为数据类,以便您轻松制作副本。然后,创建列表的副本,其中列表的每个成员也都将被复制,然后将其传递给第二个适配器。您可以使用map()完成一次复制列表及其中所有项目的两个步骤:

val secondList = firstList.map(Item::copy)