Проблема с обновлением элемента списка адаптеров - PullRequest
0 голосов
/ 28 мая 2020

Я работаю над экраном, на котором мне нужно дважды отображать одну и ту же коллекцию элементов. Я использую два RecyclerView, каждый с разными экземплярами одного и того же Adapter

Помимо двух RecyclerViews на экране у меня есть кнопка continue, чтобы go перейти к следующему экран.

Я хочу наложить некоторые ограничения на кнопку, чтобы пользователь не мог перейти к следующему экрану, если он не выберет элемент из каждого 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 Ответ

1 голос
/ 28 мая 2020

Похоже, что списки в каждом адаптере ссылаются на одни и те же экземпляры элементов списка. Это может быть связано с тем, что вы передали один и тот же список обоим адаптерам, или просто потому, что вы не создали отдельные экземпляры элементов списка в каждом списке. Если два списка ссылаются на одни и те же элементы списка, то изменение элемента списка в одном списке также изменяет его в другом.

Я рекомендую создать Item класс данных, чтобы вы могли легко делать копии. Затем создайте копию списка, в которую также скопированы все члены списка, и передайте ее второму адаптеру. Вы можете использовать map() для одновременного выполнения обоих шагов по копированию списка и всех элементов в нем:

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