2015-07-21 11 views
6

RecyclerView'ın kullanımına büyük ölçüde güvenen bir uygulama geliştiriyorum.Farklı düzenler için aynı RecyclerView Bağdaştırıcısı nasıl kullanılır?

Gerçekten farklı öğe düzenleri için aynı RecyclerView nasıl kullanılacağını bilmek gerekir. düzenleri bir örneği vardır:

1) bir isim ve açıklama içeren bir liste öğesi

2) Görüntü ve isimde bir liste öğesi

Sen ancak hafif olan, benzer olduğunu görebilirsiniz düzende değişiklikler.

Şimdiden teşekkürler! xml recyclerview öğesi Eğer içinde şişirme olacak öğelerin türüne bağlıdır olmadığından

+0

listelemek için şebekesinden düğmeye geçmek ve ne zaman bu yöntemleri Çağrı - aksi takdirde bu bir RecyclerView.Adapter alt sınıfı olmayan bir recomendation – ligi

cevap

4

, devam edin ve üç parçaları için aynı recycler görünüm düzeni dosyasını kullanabilirsiniz.

adaptörleri gelince, sizin listeleri homojen (görünüm öğenin yani tek tür) olduğu görülüyor. Her bir durum için 3 farklı adaptör kullanmanız en iyisidir. Yapıcıyı özelleştirebilir, her tür adaptör için size özel yardımcı yöntemler ekleyebilirsiniz. Eğer bir heterojen listeniz varsa

Şimdi, adaptörü getItemViewType() geçersiz kılmak ve bu yardımcı olur onCreateViewHolder() ve onBindViewHolder()

Hope uygun kullanmak zorunda kalacak!

3

Benzer bir durumla karşılaştım ve takip ettiğim model. Her şeyden

Öncelikle Fragment düzeni dosyası.

parçası düzeni dosyası tüm 3 parçaları için değiştirmeye gitmiyor (temelde fragman listelemek için benzerdir), bu yüzden liste fragmanı için bir şablon dosyasını oluşturdu.

list_fragment_template.xml 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</FrameLayout> 

Şimdi parçası kodu: Benim durumumda

3 fragmanları hemen hemen aynı şeyler (vb adaptörü, geri dönüşüm görünümü dekorasyon ve biraz daha operasyonlarını olsun, geri dönüşüm görünüm elde) yapmak.

Bir parçayı genişleten ve üzerinde değişiklik yapan bir AbstrctFragment öğesi oluşturuldu.Etroch onDestroy vb. Için yalnızca bir veri üretildiğinden ve veriyi geri dönüştürmek için veriyi geri dönüştürmeye gönderen bağdaştırıcıların her biri için değişeceğinden, verileri almak ve ayarlamak için soyut bir işlev oluşturur. Üç fragmanın her biri bu AbstractFragment'ten türetilecektir.

public abstract class AbstractFragment<E> extends Fragment { 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.template_list_fragment, container, false); 


      mRecyclerView = (RecyclerView) view.findViewById(R.id.list); 

      // get adapter to show item list 
      // and fetch data. 
      mRecyclerAdapter = getAdapter(); 
      mRecyclerView.setAdapter(mRecyclerAdapter); 

      // show it as vertical list 
      mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
      // add seperator between list items. 
      mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); 

return view; 
    } 

... onAttach onDetach ve ortak olursa olsun memberfunctions ve her fragman için geliyor üye değişkenleri.

Şimdi RecyclerView düzeni dosyaları. Hepsi düzen içinde farklı olduğundan, açıkça farklı olmalılar.

RecyclerViewAdapters: Yine burada ortak kod üyesi bildirimleri, CreateViewHolder (burada yalnızca düzen adı değişiklikleri tüm kod aynıdır dinlenme) ve bu adaptörlerin her paylaşır başka işlevi olacaktır. (liste öğeleri filtrelemek gibi bir şey). Eğer AbstractRecyclerViewAdapter bulunsun, yapmak vb bindViewholder soyut işlevleri olarak ve bu AbstractRecyclerViewAdapter elde edilebilecek 3 farklı recyclerAdapters olabilir biz parçaları için nasıl yaptığını benzer

, ..

-1
//To setViewType maybe is a solution for you.Sample below: 
private static final int TYPE_DESC = 0; 
private static final int TYPE_IMAGE = TYPE_DESC + 1; 
private static final int TYPE_THREE_TEXT = TYPE_IMAGE + 1; 
public int getItemViewType(int position) { 
    int type = super.getItemViewType(position); 
    try 
    { 
     type = Integer.parseInt(data.get(position).get("type")); 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return type; 
} 

public int getViewTypeCount() { 
    return 3; 
} 
public View getView(int position, View convertView, ViewGroup parent) { 
    int type = TYPE_DESC; 
    try 
    { 
     type = Integer.parseInt(data.get(position).get("type")); 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    ViewHolder holder = null; 
    if (convertView == null) 
    { 
     System.out.println("getView::convertView is null"); 
     holder = new ViewHolder(); 
     switch (type) 
     { 
      case TYPE_DESC: 
       convertView = View.inflate(getBaseContext(), 
         R.layout.listitem_1, null); 
       break; 
      case TYPE_IMAGE: 
       convertView = View.inflate(getBaseContext(), 
         R.layout.listitem_2, null); 
       break; 
      case TYPE_THREE_TEXT: 
       convertView = View.inflate(getBaseContext(), 
         R.layout.listitem_3, null); 
       break; 
     } 
     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    //TODO 
    return convertView; 
} 
+0

vermek zordur. OP, özellikle RecyclerView ile yardım istiyor :) –

0

çok geç ama, sizin adaptör gibi görünmelidir birisi muhtaç geliştirici için yararlı olabilir, ayrıca etkinlik bu örnek

public class SampleAdapter extends RecyclerView.Adapter<SampleAdapter.ViewHolder> { 

// Declaring Variable to Understand which View is being worked on 
// IF the view under inflation and population is header or Item 
private static final int TYPE_HEADER = 0; 
private static final int TYPE_ITEM = 1; 
private static final int TYPE_FOOTER = 2; 

private Activity mContext; 
private ArrayList<DataModel> _mItems; 
private int mLayout; 
private String mProductHeadingTitle="Heading"; 
private String mProductHeadingSubTitle="SubHeading"; 
private String loadingText="LOADING"; 
private int visibility= View.VISIBLE; 

public interface SampleAdapterInterface { 
    void itemClicked(int position); 
} 

SampleAdapterInterface mCallBack; 

public SampleAdapter(Activity context, ArrayList<DataModel> items, int item_layout) { 
    if (_mItems != null) { 
     _mItems.clear(); 
    } 
    this.mContext = context; 
    this._mItems = items; 
    this.mLayout = item_layout; 
    mCallBack = (SampleAdapterInterface) context; 
} 

@Override 
public int getItemCount() { 
    return _mItems.size()+2; // +2 for header and footer 
} 

@Override 
public int getItemViewType(int position) { 

    if (position==0) 
     return TYPE_HEADER; 
    else if(position==(_mItems.size()+1)) 
     return TYPE_FOOTER; 

    return TYPE_ITEM; 
} 

public void setHeaderData(String title,String subTitle) 
{ 
    this.mProductHeadingTitle=title; 
    this.mProductHeadingSubTitle=subTitle; 

    Log.d("LOG", "ProductHeadingTitle: " + mProductHeadingTitle); 
    Log.d("LOG", "ProductHeadingSubTitle: " + mProductHeadingSubTitle); 

    notifyDataSetChanged(); 
} 

public void setFooterData(String loadingText,int visibility) 
{ 
    this.loadingText=loadingText; 
    this.visibility=visibility; 

    Log.d("LOG", "LoadingText: " + loadingText); 
    Log.d("LOG", "Visibility: " + visibility); 

    notifyDataSetChanged(); 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 


    if (viewType == TYPE_HEADER) 
    { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header_layout,parent,false); 

     ViewHolder vhHeader = new ViewHolder(view,viewType); 

     return vhHeader; 
    } 
    else if (viewType == TYPE_ITEM) 
    { 
     View view = LayoutInflater.from(parent.getContext()).inflate(mLayout,parent,false); 

     //Creating ViewHolder and passing the object of type view 
     ViewHolder vhItem = new ViewHolder(view,viewType); 

     return vhItem; 
    } 
    else if (viewType == TYPE_FOOTER) 
    { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer_lyout,parent,false); 

     ViewHolder vhFooter = new ViewHolder(view,viewType); 

     return vhFooter; 
    } 
    return null; 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int pos) { 


    if(viewHolder.Holderid ==0) 
    { 
     // header view 
     Log.d("LOG", "in header binder"); 
     viewHolder.mProductCatalogTitle.setText(mProductHeadingTitle); 
     viewHolder.mProductCatalogSubTitle.setText(mProductHeadingSubTitle); 
    } 
    else if(viewHolder.Holderid==1) 
    { 
     final int position=pos-1; // -1 to substract header number 
     // your code 
    } 
    else if(viewHolder.Holderid==2) 
    { 
     // footer 
     Log.d("LOG", "in footer binder"); 
     viewHolder.mProgressBar.setVisibility(visibility); 
     viewHolder.mLoading.setText(loadingText); 
    } 


} 

class ViewHolder extends RecyclerView.ViewHolder { 

    int Holderid; 

    // header 
    TextView mProductCatalogTitle; 
    TextView mProductCatalogSubTitle; 

    //list 
    // item type variable declaration 

    // footer 
    ProgressBar mProgressBar; 
    TextView mLoading; 

    public ViewHolder(View itemView, int viewType) { 
     super(itemView); 
     // Here we set the appropriate view in accordance with the the view type as passed when the holder object is created 
     if(viewType == TYPE_HEADER) 
     { 
      Holderid = 0; 
      mProductCatalogTitle = (TextView) itemView.findViewById(R.id.tv_title); 
      mProductCatalogSubTitle = (TextView) itemView.findViewById(R.id.tv_subtitle); 
     } 
     else if(viewType == TYPE_ITEM) 
     { 
      Holderid = 1; 
      itemView.setClickable(true); 
      itemView.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        mCallBack.itemClicked(getAdapterPosition()-1); 
       } 
      }); 
      // initialize the view holder 
     } 

     else if(viewType == TYPE_FOOTER) 
     { 
      Holderid = 2; 
      mLoading = (TextView) itemView.findViewById(R.id.tv_loading); 
      mProgressBar = (ProgressBar) itemView.findViewById(R.id.progress_bar); 
     } 
    } 
} 

kullanarak üstbilgi ve altbilgi ekleyebilir

ve etkinliğiniz, adaptörden geri arama almak için etkinlikte SampleAdapterInterface etkinliğini uygulamalıdır. tersi Eğer uygulama hakkında daha fazla ayrıntı vermek gerekir

İlgili konular