web-dev-qa-db-ja.com

2つのアダプターを1つのRecyclerViewに設定する方法

Androidアプリを開発しています。このアプリでは、「FirebaseDatabase」に2種類の情報を保存しています。

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

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

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。

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は1つだけで、2つの異なるアダプターを1つずつ設定しているので、recyclerviewは2番目のアダプターで更新され、そのコンテンツのみを表示しています。

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

11
Hammad Nasir

1つのRecyclerViewに2つのアダプターを設定することはできません。ただし、2種類のアイテムを処理するカスタムアダプターを作成できます。方法は次のとおりです。

2つのタイプのオブジェクト[〜#〜] a [〜#〜] 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);
    ...
}

最初にgetItemViewTypeを実装する必要があります:

@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);
    } 
} 
22
Marcin Jedynak

必要に応じて、中間層を作成して複数のアダプターを受け入れることができます。

あなたが興味があるなら、私が何をしているかを見ることができます。 https://github.com/Jintin/MixAdapter

0
Jintin