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 0akan 1segera 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 LinearLayoutManagerdan 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.