我正在开发一个android应用程序,其中我在firebasedatabase上存储了两种不同类型的信息。
然后在MainActivity中,我检索它们并在RecyclerView中向用户显示。这两个信息都要显示在不同的布局中,也就是说,它们的布局是不同的,这就是为什么我有两个生成两个不同的模型类,现在有两个不同的适配器。我用的是@mikepenz的FastAdapter
所以,我在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只有一个,我正在逐个设置两个不同的适配器,因此RecyclerView将使用第二个适配器进行更新,并仅显示其内容。
因此,如何将两个适配器都显示或设置为同一个“recyclerview”,并显示存储在两个适配器中的内容。

最佳答案

不能在一个RecyclerView上设置两个适配器。但是,您可以创建一个自定义适配器来处理两种类型的项。以下是方法:
假设您需要显示两种动物和饮料的对象。让我们来处理最困难的场景,也就是说,您的对象需要完全不同的布局来显示它们,并且需要完全不同的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);
    }
}

10-07 19:17
查看更多