Ini adalah situasi yang sulit, maaf karena dokumen tidak cukup.
Saat konten adaptor berubah (dan Anda memanggil notify***()
), RecyclerView meminta tata letak baru. Sejak saat itu, hingga sistem tata letak memutuskan untuk menghitung tata letak baru (<16 md), posisi tata letak dan posisi adaptor mungkin tidak cocok karena tata letak belum mencerminkan perubahan adaptor.
Dalam kasus penggunaan Anda, karena data Anda terkait dengan konten adaptor Anda (dan saya berasumsi bahwa data diubah pada saat yang sama dengan perubahan adaptor), Anda harus menggunakan adapterPosition
.
Namun berhati-hatilah, jika Anda memanggil notifyDataSetChanged()
, karena membuat semuanya tidak valid, RecyclerView tidak tahu bahwa posisi adaptor ViewHolder hingga tata letak berikutnya dihitung. Dalam hal ini, getAdapterPosition()
akan mengembalikan RecyclerView#NO_POSITION
( -1
).
Tetapi katakanlah jika Anda telah menelepon notifyItemInserted(0)
, getAdapterPosition()
dari ViewHolder yang sebelumnya pada posisi 0
akan 1
segera mulai kembali . Jadi selama Anda mengirimkan peristiwa pemberitahuan terperinci, Anda selalu dalam keadaan baik (kami tahu posisi adaptor meskipun tata letak baru belum dihitung).
Contoh lain, jika Anda melakukan sesuatu pada klik pengguna, jika getAdapterPosition()
kembali NO_POSITION
, sebaiknya abaikan klik itu karena Anda tidak tahu apa yang diklik pengguna (kecuali Anda memiliki mekanisme lain, misalnya id stabil untuk mencari item).
Edit Saat Posisi Tata Letak Bagus
Katakanlah Anda sedang menggunakan LinearLayoutManager
dan ingin mengakses ViewHolder di atas item yang saat ini diklik. Dalam hal ini, Anda harus menggunakan posisi tata letak untuk mendapatkan item di atas.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Anda harus menggunakan posisi tata letak karena cocok dengan apa yang sedang dilihat pengguna di layar.
Dalam rangka untuk berdebat perbedaan (s) dari
getAdapterPosition()
,getLayoutPosition()
, dan jugaposition
; kami akan melihat kasus-kasus di bawah ini:1.
position
argumen dalamonBindViewHolder()
metode:Kita dapat menggunakan
position
untuk mengikat data ke tampilan dan tidak apa-apa menggunakanposition
argumen untuk melakukan ini, tetapi tidak boleh menggunakanposition
argumen untuk menangani klik pengguna dan jika Anda menggunakannya, Anda akan melihat peringatan yang memberitahu Anda "tidak memperlakukanposition
sebagai diperbaiki dan gunakanholder.getAdapterPosition()
sebagai gantinya ".2
getAdapterPosition()
.:Metode ini selalu terdiri dari posisi adaptor yang diperbarui dari
holder
. Artinya setiap kali Anda mengklik suatu item, Anda bertanya kepada adaptor tentang item tersebutposition
. jadi Anda akan mendapatkan posisi terbaru dari item ini dalam hal logika Adapter.3
getLayoutPosition()
.:Kadang-kadang, diperlukan untuk menemukan
position
segi tata letak yang diperbarui (tata letak terakhir yang dilewatkan yang dilihat pengguna sekarang), misalnya: Jika pengguna meminta yang ketiga,position
dia dapat melihat dan Anda menggunakanswipe
/dismiss
untuk item atau menerapkan animasi apa pun atau dekorasi untuk item akan lebih baik untuk digunakangetLayoutPosition()
daripadagetAdapterPosition()
, karena Anda akan selalu yakin bahwa Anda berurusan dengan posisi item dalam hal tata letak yang terbaru.Untuk informasi lebih lanjut tentang ini; lihat disini . . .
sumber