14

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

那么,如何将两个适配器显示或设置为相同的“RecyclerView”,并且可以显示存储在两个适配器中的内容。

4

3 回答 3

28

您不能在一个 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);
    } 
} 
于 2016-11-18T19:19:20.337 回答
11

连接适配器

ConcatAdapterrecyclerview: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 concatAdapter = ConcatAdapter(firstAdapter, secondAdapter, 
     thirdAdapter)
recyclerView.adapter = concatAdapter
于 2020-04-25T12:49:40.837 回答
0

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

有兴趣的可以看看我的做法。 https://github.com/Jintin/MixAdapter

于 2018-01-22T12:49:37.183 回答