Apa yang developer.android.com bicarakan tentang RecyclerView

Salam harazhiteli sayang! Posting ini mendorong saya untuk menulis artikel (atau lebih tepatnya, perasaan kenaikan suhu lokal yang tajam di daerah ... hmm, punggung bawah, yang biasanya terjadi ketika seseorang salah di Internet).


Mari kita mulai dari awal. Saya sepenuhnya setuju bahwa "ada sesuatu yang sama antara siklus kehidupan kegiatan dan pekerjaan RecyclerView" - ini adalah "sesuatu" - kebutuhan untuk memahami apa yang kita lakukan dan mengapa. Dan baca dokumentasinya. Dan kegagalan untuk memenuhi dua kebutuhan ini, seperti mimpi alasan, memunculkan monster. Hanya di sini, dengan cara yang ditawarkan penulis sebelumnya untuk melawan monster-monster ini, aku sangat tidak setuju.


Pertimbangkan 2 kondisi.


Kondisi No. kali


Jika Anda menggantung pendengar di suatu tempat, maka di tempat lain Anda harus memutuskannya. Biasanya mereka melakukan ini dalam fungsi simetris - lampirkan ke onViewAttachedToWindow , hapus ke onViewDetachedFromWindow . Kami melampirkan onBindViewHolder ... Kami tidak melampirkan onBindViewHolder . Panggilan ini tidak simetris, dapat dipanggil beberapa kali tergantung pada kondisi yang berbeda. Tidak perlu menyulitkan hidup Anda.


Jika Anda, seperti penulis artikel asli, memiliki pemikiran: "Tetapi ada kasus ketika ... di pendengar perlu untuk mempertimbangkan posisi elemen dalam daftar, akses yang tersedia di metode onBindViewHolder () dan tidak ada di onViewAttachedToWindow ()" , lalu kendarai ini terpikir. Anda tidak dapat melakukan ini. Bahkan jika Anda benar-benar menginginkannya. Sebagaimana dinyatakan dalam dokumentasi , metode ini tidak akan dipanggil jika hanya posisi elemen telah berubah, tetapi tidak isinya, jadi kami berisiko mendapatkan posisi yang salah di pendengar kami. Gunakan getAdapterPosition .


Kondisi nomor dua


RecyclerView adalah hal yang cukup rumit. Tidak perlu menyulitkan hidup Anda bahkan lebih. Jika Anda tidak terlibat dalam optimalisasi kinerja, tidak masalah bagi Anda apakah elemen ini ada di kumpulan umum atau tidak.


Hasil


Di bawah kedua kondisi ini, Anda tidak mungkin perlu menemukan kembali roda dalam bentuk flag viewWasRecycled .


Apa yang sedang terjadi


Apa yang bisa terjadi pada elemen di RecyclerView secara umum? Pertama, ingatlah bahwa ada 2 "gudang" - cache dan kumpulan. Suatu elemen masuk ke cache jika telah melampaui batas layar, tetapi dapat kembali lagi kapan saja - bahkan tanpa mengikat kembali elemen ini (mis., Metode onBindViewHolder tidak akan dipanggil). Jika cache penuh, atau karena alasan lain, RecyclerView memutuskan bahwa kami tidak memerlukan elemen ini dalam waktu dekat, itu akan pergi ke kolam (di sini onViewRecycled akan dipanggil). Item yang dipulihkan dari kumpulan akan ditautkan kembali (karena kemungkinan besar posisinya telah berubah), dan kami akan menerima panggilan onBindViewHolder . Tetapi jika elemen telah meninggalkan kumpulan, maka elemen baru akan melewati seluruh siklus - onCreateViewHolder , onBindViewHolder , onViewAttachedToWindow .


Total, kami memiliki 3 opsi untuk pengembangan acara:


  • tidak ada elemen sebelumnya: kita buat, kita lampirkan, kita lampirkan;
  • item ada di kolam: ikat, lampirkan;
  • item ada di cache: cukup lampirkan.

Dimana dan bagaimana


Apa dan pada tahap apa yang lebih baik untuk dilakukan dengan suatu elemen?


  • onCreateViewHolder . Buat, hmm, ViewHolder . Tidak perlu mengikat pendengar, mengisinya dengan konten, dll. Cukup tentukan jenis apa yang kita butuhkan dan buatlah.
  • onBindViewHolder . Kami melakukan pengikatan konten yang sebenarnya - teks, gambar. Parameter position hanya dapat digunakan dalam metode itu sendiri - kami tidak menyimpannya, kami tidak mengirimnya ke penutupan, ingat bahwa metode ini akan dipanggil lagi jika data telah berubah (dan itu tidak akan dilakukan jika hanya posisi yang berubah). Saya tidak akan menggantung Pendengar di sini juga - untuk alasan simetri.
  • onViewAttachedToWindow . Elemen sekarang akan terlihat di layar, pengguna akan dapat berinteraksi dengannya - saat yang tepat untuk melampirkan pendengar. Ingat bahwa jika kita memerlukan posisi elemen di dalamnya, maka kita mendapatkannya melalui getAdapterPosition .
  • onViewDetachedFromWindow . Item tidak akan ditampilkan di layar. Pengguna tidak akan dapat berinteraksi dengannya. Hapus pendengar.
  • onViewRecycled . Barang dikirim ke neraka kolam renang Di sini Anda dapat membebaskan sumber daya berat (gambar cache, misalnya). Jika elemen tersebut akan digunakan kembali - maka, kemungkinan besar, untuk posisi yang berbeda.

Sepertinya hanya itu saja. Saya harap saya tidak melupakan apa pun atau mencampuradukkan apa pun, tetapi jika ada, tusuk hidung Anda, jangan malu-malu.

Source: https://habr.com/ru/post/id430812/


All Articles