RecyclerView NotifyItemInserted - PullRequest
       15

RecyclerView NotifyItemInserted

0 голосов
/ 03 июля 2018

У меня есть RecyclerView.Adapter с hasStableIds(true); и LinearLayoutManager с reverseLayout(true);

Я вставляю новый элемент в список объектов в адаптере, затем вызываю NotifyItemInserted(0). Список переворачивается и загружается снизу вверх, а new item всегда внизу.

Проблема заключается в том, что при вызове NotifyItemInserted все ViewHolders «обновлены» / «перезагружены» / «воссозданы» - виджеты немного сложны и не хотят, чтобы все они создавались заново каждый раз.

Когда я отлаживаю решение, OnBindViewHolder начинается с позиции 0 (что правильно), затем поднимается до позиции 10 или 11 в зависимости от того, сколько элементов на экране, воссоздавая их все.

Я испробовал множество различных настроек на adapter, layoutmanager и на самом recyclerview, которые ни один из них не работает.

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

Я использую Xamarin.Android, но это не должно быть проблемой здесь.

1 Ответ

0 голосов
/ 03 июля 2018

Удаление hasStableIds(true) должно решить вашу проблему.

Причина:

Когда вы устанавливаете hasStableIds в true, Adapter предполагает, что у каждого элемента есть уникальный идентификатор, и использует значения, возвращенные методом getItemId(int position), для анимации изменений данных.

Это простой способ анимировать изменения без каких-либо усилий (если getItemId(int position) действительно возвращает уникальный идентификатор для элемента, иначе вы потерпите крах).

Но в вашем случае вы хотите сами анимировать изменения и контролировать, какие элементы будут перерисованы, а какие нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...