2015-04-16 8 views
65

Yeni destek kitaplığı sürümü (22.x), RecyclerView.ViewHolder sınıfının getPosition() yöntemi, konuyla ilgili yöntemlerin yerine kullanımdan kaldırılmıştır. Belgeleri okumaktan fark alamıyorum. Birisi, layman'ın şartlarındaki farkı açıklayabilir mi lütfen?RecyclerView.ViewHolder - getLayoutPosition vs getAdapterPosition

Aşağıdaki kullanım durumum var - Bağdaştırıcımın bir Listesini veriyorum ve ayrıca her liste öğesi için ek bilgileri ilişkilendirmek istiyorum. Bir konum-ekstra haritalama var ve haritalama sahipleri için kullanılabilir, böylece pozisyonları için ekstra almak ve onunla bir şeyler yapmak. Tutucuda hangi yöntemi kullanmalıyım?

0 ve 1 numaralı işaretlerdeki liste öğeleri değiştirilirken tutucu konumlarında ne olur? Yöntemler ne iade ediyor?

cevap

78

Bu zor bir durumdur, çünkü doktorlar yeterli değildir.

Bağdaştırıcı içeriği değiştiğinde (ve notify***() numaralı telefonu aradığınızda) RecyclerView yeni bir düzen ister. Bu andan itibaren, mizanpaj sistemi yeni bir mizanpajı hesaplamaya karar verene kadar (< 16 ms), pafta konumu ve adaptör pozisyonu eşleşmeyebilir, çünkü düzen henüz adaptör değişikliklerini yansıtmamıştır.

Kullanım durumunuzda, verileriniz bağdaştırıcı içeriğinizle ilgili olduğundan (ve bu verilerin bağdaştırıcı değişiklikleri ile aynı anda değiştirildiğini varsayarsak), adapterPosition kullanıyor olmalısınız.

notifyDataSetChanged() numaralı telefonu arıyorsanız, herşeyi geçersiz kıldığından, dikkatli olun, RecyclerView, ViewHolder'ın sonraki yerleşime kadar olan adaptör konumunu bilmez. Bu durumda, getAdapterPosition(), RecyclerView#NO_POSITION (-1) değerini döndürecektir.

Ama notifyItemInserted(0) aradım eğer Diyelim

hemen 1 dönen başlayacaktır pozisyonunda 0 daha önce oldu ViewHolder ait getAdapterPosition(). Öyleyse, ayrıntılı bildirim gönderiminde bulunduğunuz sürece, her zaman iyi durumdasınız (yeni düzen henüz hesaplanmamış olsa bile, adaptör konumunu biliyoruz). Eğer kullanıcı tıkladığında şey yapıyorsun eğer (bazı başka mekanizma yoksa, örneğin istikrarlı kimlikler arama için tıklandığında hangi kullanıcı bilmiyorum çünkü

başka örnek, getAdapterPosition() döner NO_POSITION, en iyisi ise tıklansın görmezden eşya). Düzen Pozisyon

İyi olduğunda İçin

Düzenle LinearLayoutManager kullanarak ve şu anda tıklandığında öğesinin üzerinde ViewHolder erişmek istediğiniz edilir düşünelim. Bu durumda, yukarıdaki öğeyi almak için düzen konumunu kullanmalısınız.

mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1) 

Yerleşim konumunu kullanmak zorundasınız, çünkü kullanıcının ekranda gördüğü ile eşleşiyor.

+1

Biraz oynandım ve getAdapterPosition() yönteminin her zaman bana -1 döndürdüğü ortaya çıkıyor. Hata ayıkladı ve nedeni, yöntemdeki kodun (son ViewParent parent = itemView.getParent(); if (! (Parent instanceof RecyclerView)) {return -1;} her zaman bloğa, yani geri dönüştürücü görünümüne her zaman girmesidir benim hücre görünümü ebeveyn değil mi? Nasıl olabilir? Sahibi oluşturmak için kodum: get MyViewHolder (LayoutInflater.from (viewGroup.getContext()). inflate (R.layout.test_list_item, viewGroup, false)); (Başka bir yorumda devam ediyor.) – wujek

+0

Kodlamayı çağırmak için kodu değiştirdiğimde (R.layout.test_list_item, viewGroup, true); ('root'a eklenecek' için doğru olanı not edin, Android atar: java.lang.IllegalStateException: Belirtilen çocuğun zaten bir ebeveyni var. Önce çocuğun ebeveyinde removeView() öğesini çağırmalısınız. Öyleyse, geri dönüşümcü görünümüne doğru şekilde eklenmiş bir görünümle bir görüntüleyici oluşturmanın doğru yolu nedir? Garip bir şekilde, getAdapterPosition() -1 değerini döndürür, çünkü üst öğe boştur, her şey iyi çalışır. – wujek

+1

Düzen şişiricisindeki boolean parametresi "addToParent" dir. Yanlış olması gerekir çünkü bunu eklemek LayoutManager'ın sorumluluğundadır. Sanırım pozisyonu zaten geçtiyseniz onBind'de getAdapterPosition öğesini çağırıyorsunuz. Teknik olarak, görünüm sahibi, onBind döndürdükten sonra bu konumu temsil eder. Btw, getAdapter konumunu, eğer ayrılmışsa bile geçerli bir konum (eğer mümkünse) döndürmek için güncelledik, yakında piyasaya sürülecek. – yigit

İlgili konular