ArrayAdapter öğesinin getViewTypeCount ve getItemViewType yöntemleri


159

Birisi düz kelimelerle bana kullanımını getViewTypeCount()ve getItemViewType()yöntemlerini açıklayabilir ArrayAdaptermi?

Yanıtlar:


308

Bunlar , farklı satırlar için farklı görünüm türleri istediğiniz durumun üstesinden gelir . Örneğin, bir kişi uygulamasında satırların bile sol tarafta resimlerin olmasını ve tek sıraların sağ tarafta resimlerin olmasını isteyebilirsiniz. Bu durumda şunları kullanırsınız:

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return position % 2;
}

Çerçeve , yönteminizde hangi görünümlerin size aktarılacağına karar vermek için görünüm türünüzü kullanırconvertViewgetView . Başka bir deyişle, yukarıdaki örnekte, çift sıralarınız yeniden kullanılmak üzere yalnızca sol taraftaki resimlere sahip geri dönüşümlü görünümler alacak ve tek sıralar yalnızca sağ taraftaki resimlere sahip olanları alacaktır.

Listenizdeki her satır aynı düzene sahipse, görünüm türleri hakkında endişelenmenize gerek yoktur. Aslında, BaseAdapter.java tüm bağdaştırıcılar için varsayılan bir davranış sağlar:

public int getItemViewType(int position) {
    return 0;
}

public int getViewTypeCount() {
    return 1;
}

Bu aslında her satır için aynı görünüm türünü sağlar.

Düzenle - genel akışı özetlemek için:

  1. Verileri AdapterViewbir adaptör kullanarak bağlarsınız.
  2. AdapterViewÇalışır kullanıcı tarafından görülebilir öğeleri görüntülemek için.
  3. Çerçeve getItemViewTypesatır gerektiriyorn bu ekrana üzeredir satır.
  4. Çerçeve, geri dönüştürülmüş görünüm havuzunu satır ntürünün görünümleri açısından kontrol eder . Herhangi bir görüş bulunamamıştır çünkü henüz hiçbir görünüm geri dönüştürülmemiştir.
  5. getViewsatır için çağrılır n.
  6. Hangi tür görünümü kullanmanız gerektiğini belirlemek getItemViewTypeiçin satır çağırın n.
  7. Hangi görünüm türünün gerekli olduğuna bağlı olarak farklı bir xml dosyasını şişirmek için bir if / switch ifadesi kullanırsınız.
  8. Görünümü bilgi ile dolduruyorsunuz.
  9. Görünümü döndürürsünüz, çıkılır getViewve satır görünümü kullanıcıya gösterilir.

Şimdi, bir görünüm ekranın dışına kaydırılarak geri dönüştürüldüğünde, çerçeve tarafından yönetilen geri dönüştürülmüş görünümler havuzuna gider. Bunlar esas olarak görünüm türüne göre düzenlenir, böylece yönteminizdeki convertViewparametrede size doğru türden bir görünüm verilir getView:

  1. Çerçeve tekrar getItemViewTypegörüntülemek istediği satırı gerektirir.
  2. Bu kez, geri dönüştürülmüş havuzda uygun tipte bir görünüm var.
  3. Geri dönüştürülmüş görünüm, yönteminize convertViewparametre olarak size iletilir getView.
  4. Geri dönüştürülmüş görünümü yeni bilgilerle doldurur ve geri verirsiniz.

1
@ Matthew, cevabın için teşekkürler. Bu yöntemlerin nasıl çağrıldığını akışı açıklayabilir misiniz? Ayrıca bunun res / layout'taki verilerimle nasıl ilişkili olduğunu anlamıyorum.
Eugene

Bu yöntemlerin ne zaman çağrıldığı konusunda açık bir sözleşme yoktur. res / layout görüntüleme nesneleri için bir yerdir . Bu bir adaptör . GetView yönteminizdeki öğe türünü kontrol etmeli ve res / düzenden uygun görünümü şişirmelisiniz.
Matthew Willis

1
GetItemViewType içinde kendiniz iade ediyorsunuz.
Matthew Willis

İlişkiyi getView'de manuel olarak yaparsınız: if (type == 0) {/ * inflate R.layout.row_icon_on_left /} else {/ inflate R.layout.row_icon_on_right * /}
Matthew Willis

75
Dikkat! getItemViewType () 0 ile getViewTypeCount () - 1 arasında bir int döndürmelidir.
PacificSky

12

İçinde farklı bakış türünü göstermek gerekirse kullanımına sonra onun iyi listesinin-görüntüleyebilir getViewTypeCount()ve getItemViewType()bir görünümü geçiş yerine adaptörü View.GONEve View.VISIBLEçok pahalı bir görev içinde olabilir getView()liste kaydırma etkileyecektir.

Lütfen bunu Adaptörde getViewTypeCount()ve getItemViewType()Adaptörde kullanın .

Bağlantı: getviewtypecount'un kullanımı


GetItemViewType () içinde IGNORE_ITEM_VIEW_TYPE döndürmek, tüm UI bileşenlerini başlatmak için getView (int konumu, View view, ViewGroup viewGroup) zorlamasında 'view' değerini her zaman null olarak geçirir. Tutucu desen durumunda, mevcut kullanıcı arayüzü görünümlerini yeniden kullanabileceğimiz ve görünümü basitçe View.GONE veya View.VISIBLE konumuna değiştirebileceğimiz kötü bir performans göstergesi değil.
Namrata Bagerwal

11

Outttt izleyin !!!!
Uygulamakta bir sorunla karşı karşıya kaldımListViewDün ve satırları kaydırdıktan hemen sonra iki tür görünüm karıştırıldı. Bu konudaki en iyi oylanan cevap iyi bir genel açıklama verse de, bahsettiğim yukarıdaki UI hatasını durdurmak için en önemli bilgiyi vurgulamamıştır.

İşte benim açıklama şudur:
Hem getViewTypeCount()ve getItemViewType()tarafından kullanılmakta olan BaseAdapter'ın getViewyöntemi geri dönüşümlü ve geri getirme gereken bir bakış hangi tip öğrenmek için. ) Ancak bu iki yöntemi Android API Dokümanına göre sezgisel olarak uygulamıyorsanız, bahsettiğim soruna girebilirsiniz.

Uygulanması için Özet Yönerge:
birden fazla türde uygulamak Viewsiçin ListViewbireyin biz aslında uygulamak zorunda sıralar, getItemViewType()ve getViewTypeCount()yöntemlerle. Ve getItemViewType()dokümantasyon bize aşağıdaki gibi bir Not verir:

Not: Tamsayılar, aralığında 0olmalıdır getViewTypeCount() - 1. IGNORE_ITEM_VIEW_TYPEayrıca iade edilebilir.

Bu nedenle getItemViewType(), Görünüm Türü için değerleri 0'dan başlayarak son türe (tür sayısı - 1) olarak döndürmelisiniz. Örneğin, yalnızca üç tür görüşünüz olduğunu varsayalım? Görünüm için veri nesnesine bağlı olarak, Bu yüzden, sadece geri dönebilirler 0 ya da 1 ya da 2 arasından getItemViewType()sıfır tabanlı dizi indeksi gibi yöntem. Kullanılan üç tür görünümünüz olduğundan, getViewTypeCount()yönteminiz 3 döndürmelidir.

Her durumda, bu yöntem için 1, 2, 3 veya 111, 222, 333 gibi başka bir tamsayı döndürürseniz, Android API Dokümanına uymadan yerleştirdiğiniz yukarıdaki kullanıcı arayüzü hatasını kesinlikle yaşayabilirsiniz.

İpucu alamadıysanız veya hala çözemediyseniz ve daha fazla bilgiye ihtiyacınız varsa, lütfen bu StackOverflow Q&A iş parçacığındaki ayrıntılı cevabımı okuyun .

İpucu hakkında daha fazla bilgi edinmek için Android Geliştirici Belgesini okuyun .

Umarım bu cevap bir sürü saat kurtarmak için orada birine yararlı olabilir !!!

Alkış !!!


1
Bahsettiğiniz için teşekkür ederiz IGNORE_ITEM_VIEW_TYPEListView birinde hata vardı. 1 resim ve 2 metin görünümünden oluşan bir görünüm eklemek için ArrayAdapter kullandım. Yalnızca bir görünüm türüm vardı. Ya yöntemi getItemViewType geçersiz kılmak ya da konumu veya sabit kodlu bir tamsayı döndürerek geçersiz kılmak için çalıştı. Her durumda, kaydırma sırasında garip davranışla (yinelenen değişiklikler) listemde kopyalar yaşıyordum. Geri dönen IGNORE_ITEM_VIEW_TYPEyöntemde sorunu giderilmiştir. Teşekkürler.
Alex

@Alex sizin için yararlı oldu sevindim! :-)
Randika Vishman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.