sadr0b0t / yashlang

PeerTube and YouTube player for Android with local playlists and whitelisted recommendations
GNU General Public License v3.0
51 stars 3 forks source link

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

Closed sadr0b0t closed 2 years ago

sadr0b0t commented 2 years ago

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

sadr0b0t commented 2 years ago

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

Подробности здесь: https://stackoverflow.com/questions/42379660/how-to-prevent-recyclerview-item-from-blinking-after-notifyitemchangedpos https://github.com/sadr0b0t/yashlang/issues/8#issuecomment-1171427267

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

sadr0b0t commented 2 years ago

https://github.com/sadr0b0t/yashlang/commit/3a102f91e352df568e2fccc9dd56a8e6003ff253

notifyItemChanged вместо notifyDataSetChanged

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

sadr0b0t commented 2 years ago

еще вариант:

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 commented 2 years ago

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

private RecyclerView videoList;
...
videoList.setItemAnimator(null);
sadr0b0t commented 2 years ago

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

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

sadr0b0t commented 2 years ago

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

sadr0b0t commented 2 years ago

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

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

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

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

sadr0b0t commented 2 years ago

вот так идеально: https://github.com/sadr0b0t/yashlang/commit/d3ec8c2aee1c0524f50a08d5de2ec891de420fa2