Android recyclerViewマルチレイアウト

13090 ワード

1.まずRecyclerViewのパッケージを導入
2.レイアウトファイルでの使用
.support.v7.widget.RecyclerView  
    android:id="@+id/myRecycler"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"/>  

彼のマルチレイアウトスタイルitem_を設定a.xmlレイアウト
  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical" android:layout_width="match_parent"  
    android:layout_height="wrap_content"  
    android:background="#65edfc"  
    android:layout_margin="5dp">  
    <TextView  
        android:id="@+id/item_a_text1"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:gravity="center"  
        android:textSize="30sp"/>  
    <TextView  
        android:id="@+id/item_a_text2"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:gravity="center"  
        android:background="#f5e593"  
        android:textSize="30sp"/>  
LinearLayout>  

item_b.xmlレイアウト
  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="horizontal" android:layout_width="match_parent"  
    android:layout_height="wrap_content"  
    android:background="#b0ed65"  
    android:layout_margin="5dp">  
    <ImageView  
        android:id="@+id/item_b_image"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:src="@mipmap/image"/>  
    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="vertical">  
        <TextView  
            android:id="@+id/item_b_text1"  
            android:layout_width="match_parent"  
            android:layout_height="0dp"  
            android:layout_weight="1"  
            android:gravity="center"  
            android:textSize="30sp"/>  
        <TextView  
            android:id="@+id/item_b_text2"  
            android:layout_width="match_parent"  
            android:layout_height="0dp"  
            android:layout_weight="1"  
            android:gravity="center"  
            android:textSize="30sp"/>  
    LinearLayout>  

LinearLayout>  

a.新しいインタフェースを作成し、Beanクラスはエントリカテゴリに戻るインタフェースを実現します.
public interface TypeInterf {  
    public int getType();  
}  

b.新しい2つのサブクラスを作成して私たちのインタフェースを実現します.ここでは1つを例に挙げます.
public class Item_a implements TypeInterf {  
    String text1;  
    String text2;  

    public String getText1() {  
        return text1;  
    }  

    public void setText1(String text1) {  
        this.text1 = text1;  
    }  

    public String getText2() {  
        return text2;  
    }  

    public void setText2(String text2) {  
        this.text2 = text2;  
    }  

    @Override  
    public int getType() {  
        return R.layout.item_a;  
    }  
}  

私たちの戻りタイプは彼のレイアウトファイルであることがわかります.そうすると、彼が戻ったときに論理がはっきりします.
c.この2つのサブクラスの複数のオブジェクトをデータソースに入れるとよい
(4)Contextとデータソースを受信し、データソースの汎用性があなたのインタフェースであれば
private Context context;  
   private List list;  

   public MyRecyclerAdapter(Context context, List list) {  
       this.context = context;  
       this.list = list;  
   }  

(5)getItemViewメソッドの書き換え
@Override  
public int getItemViewType(int position) {  
    return list.get(position).getType();  
}  

このメソッドの値はonCreateViewHoldereで与えられ、異なるtypeに基づいて異なるViewHolderを作成します.
(6)異なるタイプによって異なるViewHolderを実現する
@Override  
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
    RecyclerView.ViewHolder holder = null;  
    View view = LayoutInflater.from(context).inflate(viewType, parent, false);  
    if(viewType==R.layout.item_a){  
        holder = new ViewHolder_a(view);  
    }else{  
        holder = new ViewHolder_b(view);  
    }  
    return holder;  
}  

(7)バインドデータ
@Override  
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {  
    if(holder instanceof ViewHolder_a){  
        ((ViewHolder_a) holder).textView1.setText(((Item_a)list.get(position)).getText1());  
        ((ViewHolder_a) holder).textView2.setText(((Item_a)list.get(position)).getText2());  
    }else{  
        ((ViewHolder_b) holder).textView1.setText(((Item_b)list.get(position)).getText1());  
        ((ViewHolder_b) holder).textView2.setText(((Item_b)list.get(position)).getText2());  
    }  
}  

(8)データソースの設定
private void initData() {  
    list = new ArrayList<>();  
    Item_a item_a = null;  
    Item_b item_b = null;  
    for (int i = 0; i < 100; i++) {  
        if (i%3==0) {  
            item_a = new Item_a();  
            item_a.setText1("ItemA  "+i+" text1");  
            item_a.setText2("ItemA  "+i+" text2");  
            list.add(item_a);  
        }else{  
            item_b = new Item_b();  
            item_b.setText1("ItemB  "+i+" text1");  
            item_b.setText2("ItemB  "+i+" text2");  
            list.add(item_b);  
        }  
    }  
}