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

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

问题描述

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

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

然后在MainActivity中,我正在检索它们并将其显示给RecyclerView中的用户.这两种信息都应以不同的布局显示,即它们的布局都不同,这就是为什么我有两个制造两个不同的Model类,而现在拥有两个不同的适配器的原因.我正在使用@MikePenz的 FastAdapter

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:

让我们假设您需要显示两种类型的 A 数字对象和 B 两种对象.让我们处理最困难的情况,即您的对象需要完全不同的布局来显示它们,并且完全不同的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天全站免登陆