Closed sadr0b0t closed 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
судя по всему, у списков нужно анимацию отключать
https://github.com/sadr0b0t/yashlang/commit/3a102f91e352df568e2fccc9dd56a8e6003ff253
notifyItemChanged вместо notifyDataSetChanged
анимация пока не отключена. Может, и фиг с ней.
еще вариант:
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
вот так работает (в кучку не сбиваются, а где не сделано - сбиваются):
private RecyclerView videoList;
...
videoList.setItemAnimator(null);
Кстати, глюк с анимацией происходит в списках с картинками, загружаемыми из интернета при промотке (почти все списки). Это логично, т.к. загрузка занимает время и событие о загрузке происходит заметно позднее быстрой промотки.
Аналогичным образом в фоне загружаются не только картинки, но значения из базы данных. Но к базе данных обращение происходит гораздо быстрее.
Так, минус отключения анимации - при появлении или удалении элементов из списка налету (например, в списке закачек или в списке заблокированных видео) анимация исчезания элемента (при удалении: плавное сдвигание оставшихся элементов) тоже исчезает. Так не красиво получается, анимацию (по крайней мере в списках, в которых элементы могут появляться и исчезать при открытом экране списка) не будем удалять.
вот так, похоже, норм (анимации изменения списка работают, текст в кучку при прокрутке не сбивается):
videoList.setItemAnimator(new DefaultItemAnimator() {
@Override
public boolean canReuseUpdatedViewHolder(@NonNull RecyclerView.ViewHolder viewHolder) {
// чтобы картинки и текст не сбивались в кучку при быстрой промотке
// см: https://github.com/sadr0b0t/yashlang/issues/129
return true;
}
});
совет по ссылкам выше.
Еще возможный вариант - переопределить animateChange у того же DefaultItemAnimator
Использовать notifyItemChanged вместо notifyDataSetChanged во всех адаптерах. Возможно, длинные списки будут загружаться чуть шустрее.