2016-08-10 3 views
1

Предположим, у меня есть 40 элементов в RecyclerView. 20 предметов в нем имеют одно и то же намерение, каждое из которых будет запущено при касании. На каждом 5-секундном интервале намерение изменяется, поэтому 20 из 40 пунктов будут заменены их намерениямиЕсть ли способ обновить некоторые элементы в RecyclerView без переустановки?

Есть ли способ обновить все намерения по каждому из 20 предметов, не переустанавливая их?

Каждый раз, когда он восстанавливается, элемент исчезает и появляется, и с 5-секундным интервалом времени было бы неинтересно видеть, что предметы постоянно появляются и исчезают.

Я думал, что переменная должна указывать на объект, так что, когда этот объект обновляется, намерение элементов также обновляется. Но Java - это пропускная способность, поэтому шансов нет.

Любые идеи?

ответ

2

Если визуальные эффекты не изменяются, тогда нет никаких оснований для повторной обработки. Просто дайте данные элементам, которые нуждаются в обновлении, и не вызывайте RecyclerView.Adapter#notifyItemChanged() на адаптере. RecyclerView не будет уведомлен о повторной обработке, и базовые данные будут обновлены.

Если изображения сделать изменить, но вы не хотите мигать, тогда вы можете использовать пользовательский ItemAnimator, который просто не оживляет.

Простым методом может быть просто позвонить ItemAnimator#setChangeDuration() со значением 0 на ItemAnimator, который вы используете, чтобы он начинался и заканчивался немедленно.

+0

Обновление данных БЕЗ уведомления об изменениях, которые были изменены, не будет иметь никакого эффекта. Только когда адаптер будет уведомлен, новое значение будет заменено старым значением. В моем случае мне не нужны визуальные изменения, но данные не были обновлены, если я не позвоню, скажите адаптеру, например. 'notifyDataSetChanged()' – Kyle

+1

@Kyle. Это может быть много причин. Я предполагаю, что адаптер поддерживается какой-то базовой структурой данных, такой как «Список». Я также предполагаю, что каждый раз, когда вызывается 'onBind()', вы передаете элемент в позиции 'x', передавая его' ViewHolder'. Вы можете обновить элемент в позиции 'x' без уведомления адаптера. Он будет обновляться как в «List», так и в «ViewHolder», потому что оба объекта содержат ссылки на один и тот же элемент. Исключение было бы, если вы кешируете или копируете элемент, и в этом случае вы создадите две ссылки. – DeeV

+0

Вы правы - мой адаптер поддерживает структуру данных. Если бы это было не так, то, по-вашему, вы, вероятно, сработаете. Тем не менее, возиться с ItemAnimator получил то, что я хотел - спасибо за отличное предложение. – Kyle

Смежные вопросы