如何将两个适配器设置为一个 RecyclerView? [英] How to set two adapters to one RecyclerView?

查看:31
本文介绍了如何将两个适配器设置为一个 RecyclerView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个 Android 应用,其中我在FirebaseDatabase"上存储了两种不同类型的信息.

I am developing an android app in which I'm storing two different types of information on 'FirebaseDatabase`.

然后在 MainActivity 中,我检索它们并在 RecyclerView 中显示给用户.这两个信息都旨在以不同的布局显示,即它们的布局不同,这就是为什么我有两个创建两个不同的 Model 类,现在有 2 个不同的适配器.我正在使用 FastAdapter @MikePenz

Then in the MainActivity, I'm retrieving them and showing to users in a RecyclerView. Both information are meant to be shown in different layouts, i.e., the layouts for both of them are different and that's why I have two make two different Model class and now have 2 different adapters. I'm using FastAdapter by @MikePenz

所以,我所做的是按照与从数据库中获取信息相同的顺序在 recyclerview 上设置适配器:

So, what I did is I set the adapter on recyclerview in the same sequence as the information is fetched from database:

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 只有一个,我正在一个接一个地设置 2 个不同的适配器,所以 recyclerview 正在使用第二个适配器进行更新,并且只显示它的内容.

as the recyclerview is only one and I'm setting 2 different adapters one by one, the recyclerview is getting updated with the 2nd adapter and showing only it's content.

那么,如何将两个适配器显示或设置为相同的RecyclerView",并显示存储在两个适配器中的内容.

So, how can I show or set both the adapter to the same 'RecyclerView' and can show the content stored in both the adapters.

推荐答案

不能在一个 RecyclerView 上设置两个适配器.但是,您可以制作一个自定义适配器来处理两种类型的项目.方法如下:

You cannot set two adapters on one RecyclerView. However you can make a custom Adapter that handles two types of items. Here is how:

假设您需要显示两种类型的对象Animals 和 Beverages.让我们来处理最困难的情况,即您的对象需要完全不同的布局来显示它们,并且需要完全不同的 ViewHolders.这是ViewHolders:

Let's assume you need to display objects of two types Animals and Beverages. Let's handle the hardest scenario, that is, your objects require completely different layouts to display them and completely different ViewHolders. Here are the 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
        ...
    }
}

首先向适配器添加代表视图类型的常量:

First you add constants to your adapter representing your view types:

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

为了简单起见,假设您将对象存储在列表中:

For the sake of simplicity lets assume you store your objects in a list:

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 中的项目类型:

Next you use the item type inside 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);
    } 
} 

最后你绑定了正确的视图持有者:

Finally you bind proper view holder:

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

这篇关于如何将两个适配器设置为一个 RecyclerView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆