Size: a a a

Android Developers

2020 March 27

MK

Maxim Kovalev in Android Developers
Суть ресайклера как раз в том, чтобы переиспользовать вьюхи
источник

AO

Andrei Osipov in Android Developers
Eugene Kostyuk
Привет тем кто не спит) Столкнулся с интересной темой, может я чего-то не знаю по ресайклер) У меня на карточке свитчер есть, ставлю его на нулевом элементе в isChecked и свитчер на девятой карточке тоже ставится в isChecked, что за магия?)
Сохраняй значение isChecked в какой-нибудь булевой переменной и при каждом байндинге устанавливай у чекбокса isChecked в эту булеву переменную.
Это происходит потому что ресайклер переиспользует уже созданные вьюшки. Ты один раз состояние чекбокса поменял, а при переиспользовании уже для другого элемента датасета не обновляешь
источник

EK

Eugene Kostyuk in Android Developers
Andrei Osipov
Сохраняй значение isChecked в какой-нибудь булевой переменной и при каждом байндинге устанавливай у чекбокса isChecked в эту булеву переменную.
Это происходит потому что ресайклер переиспользует уже созданные вьюшки. Ты один раз состояние чекбокса поменял, а при переиспользовании уже для другого элемента датасета не обновляешь
Проблема в том, что эта самая булевая переменная меняется в слушателе свитчера) Проще говоря модель слушает свитчер и меняет значение. А свитчер выдаёт ей новое значение, справедливое для 9 вью, а не для 0)
источник

EK

Eugene Kostyuk in Android Developers
Замкнутый круг )
источник

AO

Andrei Osipov in Android Developers
Eugene Kostyuk
Проблема в том, что эта самая булевая переменная меняется в слушателе свитчера) Проще говоря модель слушает свитчер и меняет значение. А свитчер выдаёт ей новое значение, справедливое для 9 вью, а не для 0)
Ты в onBindViewHolder обновляешь?
источник

AO

Andrei Osipov in Android Developers
Ещё вариант - для обновления ты модели ты используешь неправильную позицию для получения элемента из датасета
источник

AO

Andrei Osipov in Android Developers
Но тут уже код надо смотреть)
источник

EK

Eugene Kostyuk in Android Developers
Andrei Osipov
Ты в onBindViewHolder обновляешь?
Ну в этом методе я у view holder вызываю метод bind и передаю туда модель по индексу
источник

AO

Andrei Osipov in Android Developers
Код кидай, быстрее тебе ответят)
источник

EK

Eugene Kostyuk in Android Developers
источник

EK

Eugene Kostyuk in Android Developers
Тут все по классике
источник

EK

Eugene Kostyuk in Android Developers
Сейчас нет доступа к коду, это скрин остался
источник

EK

Eugene Kostyuk in Android Developers
В bind я просто ставил on checked change listener и менял поле у модели
источник

EK

Eugene Kostyuk in Android Developers
И происходило то, что происходило) изменяется девятый элемент, а меняется модель первого)
источник

EK

Eugene Kostyuk in Android Developers
По сути viewholder если оставить пустой, то есть ничего из кода не менять и запустить
источник

EK

Eugene Kostyuk in Android Developers
А потом свитчер в true перевести на нулевой вьюшке, то на 9 тоже будет свитчер в true
источник

EK

Eugene Kostyuk in Android Developers
Я решил для себя эту проблему увеличением кеш элементов в итоге, тк это не критично и у меня больше 15 элементов в списке не будет
источник

EK

Eugene Kostyuk in Android Developers
Andrei Osipov
Код кидай, быстрее тебе ответят)
Но если бы был кейс с большим списком, было бы весело)
источник

AO

Andrei Osipov in Android Developers
Eugene Kostyuk
Я решил для себя эту проблему увеличением кеш элементов в итоге, тк это не критично и у меня больше 15 элементов в списке не будет
Ой зря)
источник

EK

Eugene Kostyuk in Android Developers
Andrei Osipov
Ой зря)
Кеш на 15 элементов ничего не сделает, там модель на 4 поля, я потестил на старом девайсе даже, для уверенности. Но это затычка только для текущего кейса)
источник