Bu aldatıcı bir durum, maalesef belgeler yeterli değil.
Adaptör içeriği değiştiğinde (ve siz çağırdığınızda notify***()) RecyclerView yeni bir düzen ister. O andan itibaren, yerleşim sistemi yeni bir yerleşim planını hesaplamaya karar verene kadar (<16 ms), düzen henüz adaptör değişikliklerini yansıtmadığından yerleşim konumu ve bağdaştırıcı konumu eşleşmeyebilir.
Kullanım durumunuzda, verileriniz adaptör içeriğinizle ilgili olduğu için (ve verilerin adaptör değişiklikleri ile aynı anda değiştiğini varsayıyorum), kullanmalısınız adapterPosition.
notifyDataSetChanged()Her şeyi geçersiz kıldığı için arıyorsanız dikkatli olun , RecyclerView bir sonraki düzen hesaplanana kadar ViewHolder'ın adaptör pozisyonunu bilmez. Bu durumda ( ) getAdapterPosition()döndürür .RecyclerView#NO_POSITION-1
Eğer aradım Ama eğer söz sağlayan notifyItemInserted(0), getAdapterPosition()pozisyonda daha önce hangi ViewHolder ait 0dönen başlayacaktır 1hemen. Parçalı bildirim olayları gönderdiğiniz sürece, her zaman iyi durumdasınız (yeni düzen henüz hesaplanmasa bile bağdaştırıcı konumunu biliyoruz).
Başka bir örnek, kullanıcı tıklamasıyla ilgili bir şey yapıyorsanız, getAdapterPosition()geri dönüyorsa NO_POSITION, en iyisi o tıklamayı yok saymaktır çünkü kullanıcının neye tıkladığını bilmiyorsunuz (başka bir mekanizma, örneğin öğeyi aramak için kararlı kimlikleriniz yoksa).
Düzen Konumu İyi Olduğunda Düzenleyin
Diyelim ki LinearLayoutManager, şu anda tıklanan öğenin üzerindeki ViewHolder'ı kullanıyorsunuz ve ona erişmek istiyorsunuz. Bu durumda, yukarıdaki öğeyi almak için yerleşim konumunu kullanmalısınız.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Düzen konumunu kullanmak zorundasınız çünkü kullanıcının o anda ekranda gördüğü konumla eşleşiyor.