6

私は 'FirebaseDatabase`の2種類の情報を格納しているアンドロイドアプリを開発しています。2つのアダプタを1つのRecyclerViewに設定する方法は?

次に、MainActivityでは、それらを取得して、RecyclerViewのユーザーに表示しています。両方の情報は異なるレイアウトで表示されることを意図しています。つまり、両方のレイアウトが異なります。そのため、2つの異なるModelクラスを作成し、2つの異なるアダプタを使用しています。

1.

public void prepareDataOfSRequests() { 
     gModelClass = new GModelClass(postedBy, ***, ***, ***, "error", ***, formattedTime, currentLatitude, currentLongitude, utcFormatDateTime, userEmail, userID, null, ***, itemID); 
     fastItemAdapter.add(0, gModelClass); 
     recyclerView.setAdapter(fastItemAdapter); 
     recyclerView.smoothScrollToPosition(0); 
     emptyRVtext.setVisibility(View.INVISIBLE); 
    } 

2:私は、私がやったことは情報がデータベースからフェッチされると私は同じ順序でrecyclerviewにアダプタを設定されているので、@MikePenz

FastAdapterを使用しています。

public void prepareDataOfERequests() { 
     eModelClass = new EModelClass(***, ***, ***, ***, "error", ***, formattedTimeE, currentLatitudeE, currentLongitudeE, utcFormatDateTimeE, userEmailE, userIDE, null, ***, ***, ***, ***, itemID); 
     fastItemAdapterER.add(eventRequestsModelClass); 
     recyclerView.setAdapter(fastItemAdapterER); 
     recyclerView.smoothScrollToPosition(0); 
     emptyRVtext.setVisibility(View.INVISIBLE); 
    } 

recyclerviewは一つだけであると私は一つ一つ、recyclerviewは、第二のアダプターで更新のみ示すなっている2つの異なるアダプタを設定していてそれは内容です。

どのようにして、両方のアダプタを同じ「RecyclerView」に表示または設定し、両方のアダプタに格納されているコンテンツを表示することができますか。

+0

あなたはviewholderの2種類を行うことができますし、インターフェイスをお願い...項目がINSTANCEOFがそうでなければviewholder1 viewholder2 – JCDecary

+0

を描くClass1のであれば@ JCDecaryしかし、私はそれらの両方をrecyclerviewに示す必要があります。私はあなたのコードがいずれかを表示すると思います。右? –

+0

あなたはどちらも持っていないでしょう。getitemcountをオーバーライドする必要があります – JCDecary

答えて

11

1つのRecyclerViewに2つのアダプターを設定することはできません。ただし、2種類のアイテムを扱うカスタムアダプターを作成することはできます。ここではどのようにある:

は、あなたが2種類 nimalsとB everagesのオブジェクトを表示する必要があると仮定しましょう。最も難しいシナリオを扱いましょう。すなわち、あなたのオブジェクトはそれらを表示するために完全に異なるレイアウトを必要とし、完全に異なるViewHoldersです。ここでViewHoldersです:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    ... 
    private static class AnimalViewHolder extends RecyclerView.ViewHolder { 
     public AnimalViewHolder(View itemView) { 
      super(itemView); 

      // prepare your ViewHolder 
     } 

     public void bind(Animal animal) { 
      // display your object 
     } 
    } 

    private static class BeverageViewHolder extends RecyclerView.ViewHolder { 
     // like the one above 
     ... 
    } 
} 

まず、あなたのビュータイプを表すアダプタに定数を追加します。

private static final int ITEM_TYPE_ANIMAL; 
private static final int ITEM_TYPE_BEVERAGE; 

簡略化のためには、リストにあなたのオブジェクトを格納仮定することができます:

private List<Object> items = new ArrayList<>(); 

public MyAdapter(List<Object> items) { 
    this.items.addAll(items); 
    ... 
} 

まず、を実装する必要があります。

@Override 
public int getItemViewType(int position) { 
    if (items.get(position) instanceof Animal) { 
     return ITEM_TYPE_ANIMAL; 
    } else { 
     return ITEM_TYPE_BEVERAGE; 
    } 
} 

次はあなたがonCreateViewHolder内の項目タイプを使用します。

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 

    if (viewType == ITEM_TYPE_ANIMAL) { 
     layoutInflater.inflate(R.layout.item_animal, parent, false); 

     return new AnimalViewHolder(view); 
    } else {  
     layoutInflater.inflate(R.layout.item_beverage, parent, false); 

     return new BeverageViewHolder(view); 
    } 
} 

最後に、あなたは適切なビューホルダーをバインド:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    Object item = items.get(position); 

    if (viewHolder instanceof AnimalViewHolder) { 
     ((AnimalViewHolder) viewHolder).bind((Animal) item); 
    } else { 
     ((BeverageViewHolder) viewHolder).bind((Beverage) item); 
    } 
} 
+0

レイアウトリソースIDを 'getItemViewType'の中に返すことができます。そして、 'onCreateViewHolder'では、メソッドのパラメータに' viewType'を展開します。 –

+0

しかし、両方のレイアウトで同じViewHolderを使用している場合にのみ、このトリックは最大限の可能性に達します。それ以外の場合は、作成とバインドにif-elsesを使用し、利得は最小限に抑えられます。 –

0

あなたが好きなら、あなたは間違いなく、複数のアダプタを受け入れるように、中間層を書くことができます。

はあなたが興味のある場合、私は何をすべきかを見てみることができます。 https://github.com/Jintin/MixAdapter

関連する問題