Предиктивная анимация RecyclerView не работает с setHasStableIds и notifyDatasetChanged

Я использую setHasStableIds в адаптере и вызываю весь notifyDatasetChanged вместо notifyItemXYZ по разным причинам. Я получаю простые анимации, начиная с setHasStableIds(true), но при удалении элемента закадровый элемент, который теперь должен скользить на экране, просто исчезает. "https://youtu.be/imsr8NrIAMs" rel="nofollow noreferrer">https://youtu.be/imsr8NrIAMs). Когда я использую notifyItemRemoved, он работает (однако мой другой код становится очень неудобным)

TLDR; Есть ли способ получить предиктивную (не только простую) анимацию при использовании setHasStableIds и notifyDatasetChanged с RecyclerView? (кроме использования notifyItemRemoved)


person urSus    schedule 08.11.2016    source источник


Ответы (1)


Спросил несколько лет назад, но, возможно, это будет полезно для тех, кто ищет способ сделать это.

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

rv.setLayoutManager(new LinearLayoutManager(rv.getContext()) {
        @Override
        protected int getExtraLayoutSpace(RecyclerView.State state) {
            return Math.max(averageItemSizePx, super.getExtraLayoutSpace(state));
        }
});

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

Но иногда этот подход дает непредсказуемую анимацию - это зависит от последнего направления прокрутки (из источников LinearLayoutManager)

person j2esu    schedule 19.11.2018