我正在开发一款Android应用,我在其中将两种不同类型的信息存储在“FirebaseDatabase”中。
然后在MainActivity
中,我正在检索它们并向RecyclerView
中的用户展示。这两个信息都是以不同的布局显示的,即它们的布局都不同,这就是为什么我有两个不同的Model类,现在有两个不同的适配器。我使用@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只有一个,我一个接一个地设置2个不同的适配器,所以Recyclerview正在使用第二个适配器进行更新并仅显示它的内容。
那么,我怎样才能将适配器显示或设置为相同的' RecyclerView'并且可以显示存储在两个适配器中的内容。
答案 0 :(得分:21)
您无法在一个RecyclerView上设置两个适配器。但是,您可以创建一个处理两种类型项的自定义适配器。方法如下:
假设您需要显示两种类型 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);
}
}
答案 1 :(得分:6)
MergeAdapter是recyclerview:1.2.0-alpha02中提供的新类 这使您可以依次组合多个适配器 显示在单个RecyclerView中。这使您更好 封装您的适配器,而不必合并许多数据 源集成到单个适配器中,使它们集中并可重复使用。
来源:https://medium.com/androiddevelopers/merge-adapters-sequentially-with-mergeadapter-294d2942127a
val firstAdapter: FirstAdapter = …
val secondAdapter: SecondAdapter = …
val thirdAdapter: ThirdAdapter = …
val mergeAdapter = MergeAdapter(firstAdapter, secondAdapter,
thirdAdapter)
recyclerView.adapter = mergeAdapter
答案 2 :(得分:0)
如果您愿意,您绝对可以编写一个中间层来接受多个适配器。
如果您有兴趣,可以看看我做了什么。 https://github.com/Jintin/MixAdapter