Animasi prediktif RecyclerView tidak berjalan dengan setHasStableIds dan notifyDatasetChanged

Saya menggunakan setHasStableIds di adaptor dan memanggil seluruh notifyDatasetChanged alih-alih notifyItemXYZ karena berbagai alasan. Saya mendapatkan animasi sederhana sejak setHasStableIds(true), tetapi saat menghapus item, item di luar layar yang seharusnya meluncur di layar sekarang, menghilang begitu saja. (Persis seperti halnya dengan mematikan animasi prediktif di pembicaraan Chet Haase https://youtu.be/imsr8NrIAMs). Saat saya menggunakan notifyItemRemoved, ini berfungsi (namun kode saya yang lain menjadi sangat merepotkan)

TLDR; apakah ada cara untuk mendapatkan animasi prediktif (tidak hanya sederhana) saat menggunakan setHasStableIds & notifyDatasetChanged dengan RecyclerView? (selain menggunakan notifyItemRemoved)


person urSus    schedule 08.11.2016    source sumber


Jawaban (1)


Ditanyakan beberapa tahun yang lalu, tapi mungkin ini akan membantu bagi seseorang yang mencari cara untuk melakukan ini.

Anda dapat mengganti metode getExtraLayoutSpace di pengelola tata letak Anda untuk mengembalikan, misalnya, setidaknya ukuran item rata-rata dalam piksel (untuk menyembunyikan animasi non-prediktif di luar layar).

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

Tentu saja, ini memerlukan biaya kinerja, jadi berhati-hatilah.

Namun terkadang pendekatan ini memberi Anda animasi yang tidak dapat diprediksi - ini bergantung pada arah gulir terakhir (dari sumber LinearLayoutManager)

person j2esu    schedule 19.11.2018