Çoklu görünüm türüne sahip RecyclerView nasıl oluşturulur?
https://developer.android.com/preview/material/ui-widgets.html adresinden
RecyclerView.Adapteroluşturduğumuzda, adaptör ile bağlanacak
ViewHolder` belirtmeliyiz.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.some_layout, parent, false);
//findViewById...
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(mDataset[position]);
}
@Override
public int getItemCount() {
return mDataset.length;
}
}
Peki, birden fazla görünüm türüne sahip RecyclerView
oluşturmak mümkün mü?
794
3
Evet, bu mümkün. Sadece getItemViewType() uygulayın ve
onCreateViewHolder()
içindekiviewType
parametresine dikkat edin.Yani şöyle bir şey yaparsınız:
Görünüm türleri için düzenler yalnızca birkaç taneyse ve bağlama mantığı basitse, Anton'un çözümünü izleyin.
Ancak karmaşık düzenleri ve bağlama mantıklarını yönetmeniz gerekiyorsa kod dağınık olacaktır.
Aşağıdaki çözümün karmaşık görünüm türlerini ele alması gereken biri için yararlı olacağına inanıyorum.
Temel DataBinder sınıfı
Bu sınıfta tanımlanması gereken fonksiyonlar, tek görünüm tipi oluştururken adaptör sınıfıyla hemen hemen aynıdır.
Her görünüm türü için, bu DataBinder'ı genişleterek sınıfı oluşturun.
Örnek DataBinder sınıfı
DataBinder sınıflarını yönetmek için adaptör sınıfı oluşturun.
Temel DataBindAdapter sınıfı
Bu temel sınıfı genişleterek sınıfı oluşturun ve ardından DataBinder sınıflarını örnekleyin ve soyut yöntemleri geçersiz kılın
getItemCount DataBinders'ın toplam öğe sayısını döndürür
getItemViewType Adaptör konumu ve görünüm türü arasındaki eşleme mantığını tanımlayın.
getDataBinder Görünüm türüne göre DataBinder örneğini döndürür
getPosition Belirtilen DataBinder'daki konumdan bağdaştırıcı konumuna dönüştürme mantığını tanımlama
getBinderPosition Adaptör konumundan DataBinder'daki konuma dönüştürme mantığını tanımlayın
Umarım bu çözüm yardımcı olur.
GitHub'da daha ayrıntılı çözüm ve örnekler bıraktım, bu nedenle ihtiyacınız olursa lütfen aşağıdaki bağlantıya bakın.
https://github.com/yqritc/RecyclerView-MultipleViewTypesAdapter
Anton'un çözümünü izleyerek, farklı düzen türlerini tutan / işleyen / temsil eden bu
ViewHolder
ile gelin. Ancak, geri dönüşüm görünümününViewHolder
ı veri yuvarlama türü olmadığında yeni düzenin değiştirilmesinin işe yarayıp yaramayacağından emin değilim.Yani kısaca, onCreateViewHolder(ViewGroup parent, int viewType)` sadece yeni görünüm düzeni gerektiğinde çağrılır;
viewType
içingetItemViewType(int position)
çağrılacaktır;onBindViewHolder(ViewHolder holder, int position)
her zaman görünümü geri dönüştürürken çağrılır (yeni veri getirilir ve bu
ViewHolder` ile görüntülenmeye çalışılır).Dolayısıyla
onBindViewHolder
çağrıldığında doğru görünüm düzenini yerleştirmesi veViewHolder
ı güncellemesi gerekir.Bu
ViewHolder
ın getirilmesi için görünüm düzenini değiştirmenin yolu doğru mu veya herhangi bir sorun var mı? Her türlü yorum için minnettarım!Düzenle: ViewHolder, görünümü tutmak için mItemViewType üyesine sahiptir
Düzenleme: onBindViewHolder(ViewHolder holder, int position)'da aktarılan ViewHolder, eşleştiğinden emin olmak için getItemViewType(int position)'a bakılarak alınmış (veya oluşturulmuş) gibi görünüyor, bu nedenle ViewHolder'ın türünün data[position]'s türüyle eşleşmemesi konusunda endişelenmenize gerek olmayabilir. onBindViewHolder() içindeki ViewHolder'ın nasıl alındığını bilen var mı?
Düzenleme: Geri dönüşüm
ViewHolder
türe göre seçilmiş gibi görünüyor, bu yüzden orada savaşçı yok.Düzenleme: http://wiresareobsolete.com/2014/09/building-a-recyclerview-layoutmanager-part-1/ bu soruyu yanıtlıyor.
Geri dönüşüm
ViewHolder
gibi olur:veya doğru türde geri dönüşüm
ViewHolder
bulamazsanız yeni bir tane oluşturun.