Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Использовать notifyItemChanged вместо notifyDataSetChanged #129

Closed
sadr0b0t opened this issue Jun 30, 2022 · 8 comments
Closed
Labels
enhancement New feature or request

Comments

@sadr0b0t
Copy link
Owner

Использовать notifyItemChanged вместо notifyDataSetChanged во всех адаптерах. Возможно, длинные списки будут загружаться чуть шустрее.

@sadr0b0t sadr0b0t added the enhancement New feature or request label Jun 30, 2022
@sadr0b0t
Copy link
Owner Author

Поменял в основных списках. Субъективно, проматывать стало шустрее (но это не точно). Зато появился любопытный баг - при быстрой прокрутке длинного списка пролистанные картинки и текст остаются "кучкой" на экране, но исчезают в течение секунды плавно. Выглядит как глюк, хотя понятно, что это анимация.

Подробности здесь:
https://stackoverflow.com/questions/42379660/how-to-prevent-recyclerview-item-from-blinking-after-notifyitemchangedpos
#8 (comment)

судя по всему, у списков нужно анимацию отключать

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 1, 2022

3a102f9

notifyItemChanged вместо notifyDataSetChanged

анимация пока не отключена. Может, и фиг с ней.

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 1, 2022

еще вариант:

This happening because Adapter is creating new ViewHolder and trying to animate between old and new ViewHolders. That's why all the "disable animations" answers technically work.
Instead you can just tell the RecyclerView to re-use Viewholders with canReuseUpdatedViewHolder(). See this answer to a similar question: https://stackoverflow.com/a/60427676/1650674

https://stackoverflow.com/questions/42379660/how-to-prevent-recyclerview-item-from-blinking-after-notifyitemchangedpos
https://stackoverflow.com/a/64345265
https://stackoverflow.com/questions/30667014/why-recyclerview-notifyitemchanged-will-create-a-new-viewholder-and-use-both-t/60427676#60427676

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 1, 2022

вот так работает (в кучку не сбиваются, а где не сделано - сбиваются):

private RecyclerView videoList;
...
videoList.setItemAnimator(null);

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 1, 2022

Кстати, глюк с анимацией происходит в списках с картинками, загружаемыми из интернета при промотке (почти все списки). Это логично, т.к. загрузка занимает время и событие о загрузке происходит заметно позднее быстрой промотки.

Аналогичным образом в фоне загружаются не только картинки, но значения из базы данных. Но к базе данных обращение происходит гораздо быстрее.

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 1, 2022

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

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 1, 2022

вот так, похоже, норм (анимации изменения списка работают, текст в кучку при прокрутке не сбивается):

        videoList.setItemAnimator(new DefaultItemAnimator() {
            @Override
            public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) {
                // чтобы картинки и текст не сбивались в кучку при быстрой промотке
                // см: https://github.com/sadr0b0t/yashlang/issues/129
                return true;
            }
        });

совет по ссылкам выше.

Еще возможный вариант - переопределить animateChange у того же DefaultItemAnimator

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 1, 2022

вот так идеально: d3ec8c2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant