适配器列表项目更新问题

问题描述 投票:0回答:1

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

是叫什么?

android kotlin android-recyclerview adapter
1个回答
1
投票

听起来每个适配器中的列表都引用了相同的列表项实例。这可能是因为你向两个适配器传递了相同的列表,或者只是你没有在每个列表中创建不同的列表项实例。如果两个列表引用相同的列表项,那么在一个列表中改变一个列表项也会在另一个列表中改变它。

我建议将 Item 一个数据类,这样你就可以轻松地进行复制。然后创建一个列表的副本,其中列表的每个成员也被复制,并将其传递给第二个适配器。你可以使用 map() 一次完成复制列表和其中的项目的两个步骤。

val secondList = firstList.map(Item::copy)
© www.soinside.com 2019 - 2024. All rights reserved.