如何将两个适配器设置为一个RecyclerView?

如何将两个适配器设置为一个RecyclerView?

问题描述:

我正在开发中,我存储两种不同类型的关于“FirebaseDatabase`信息的Android应用程序。如何将两个适配器设置为一个RecyclerView?

然后在MainActivity,我检索它们并示出了RecyclerView给用户。这两个信息都是用不同的布局显示的,即两个布局的布局不同,这就是为什么我有两个不同的Model类,现在有两个不同的适配器。我使用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只有一个,我设置2个不同适配器一个接一个,recyclerview是越来越与第二适配器只显示更新它的内容。

所以,我怎么能显示或设置两个适配器相同的“RecyclerView”和可以显示存储在这两个适配器的内容。

+0

你可以做两型viewholder的,并要求接口...如果产品}这种CLASS1画viewholder1否则viewholder2 – JCDecary

+0

@ JCDecary,但我必须在回收者视图中显示他们两个。我认为你的代码会显示任何一个。对? –

+0

不,你会有两个你必须覆盖getitemcount – JCDecary

你不能在一个RecyclerView设置两个适配器。但是,您可以制作处理两种类型项目的自定义适配器。这里是如何:

让我们假设你需要显示两种类型一个 nimals和 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); 
    } 
} 
+0

您可以在'getItemViewType'中返回布局资源ID。然后在'onCreateViewHolder'方法中,在方法参数中添加'viewType'。 –

+0

你可以,但只有当你对两种布局使用相同的ViewHolder时,这个技巧才能充分发挥其潜力。否则,你会在创建和绑定时使用if-elses,并且获得的收益很小。 –

如果你喜欢,你绝对可以写一个中间层接受多个适配器。

你可以看看,如果你有兴趣我做的。 https://github.com/Jintin/MixAdapter