分页库 - 一个具有多种视图类型的回收器

Paging library - one recycler with multiple view types

我在我的项目中使用了所有 Android 架构组件(Room DB、实时数据等)。目前,我面临一个问题,我有 RecyclerView,它应该使用从 Room DB 加载的数据并显示它与分页库。问题是有多个数据 类 表示新闻源中的项目并存储在 Room 中,我需要在那个回收站中显示它们。

有什么方法可以轻松解决吗?例如,我可以创建一些接口供所有这些 类 使用吗?

您可以创建和连接

public interface NeewsFeedItem
    String getTitle();
    int getType();
    String data();
...

您的每个模型 implement NeewsFeedItem 和在您的 Adapter 内部,您决定显示什么类型的视图以及如何显示正确的 NeewsFeedItem

您可以覆盖 getItemViewType 以针对不同的 NeewsFeed 类型显示不同的呈现方式。

您还可以查看 FlexibleAdapter 库,它可以帮助管理具有不同类型、页眉、页脚等的适配器。

我想将 header 添加到 recyclerView。第一个位置不能有不同的项目类型,因为重新加载项目后的库导致 recyclerview 一直向下滚动到列表底部。

我创建了 ViewHolder 来保存我的常规列表项和我的 header。这样我的常规项目就在位置 0 header,库停止滚动到 recyclerView 的底部,因为第一个项目也是分页的项目。

您可以通过覆盖 RecyclerView.Adapter 的 getItemViewType() 方法来提供多个 View holder 以列出。

代码段

  @Override
public int getItemViewType(int position) {
    // Just as an example, return 0 or 2 depending on position
    // Note that unlike in ListView adapters, types don't have to be contiguous
    return position % 2 * 2;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     switch (viewType) {
         case 0: return new ViewHolder0(...);
         case 2: return new ViewHolder2(...);
         ...
     }
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    switch (holder.getItemViewType()) {
        case 0:
            ViewHolder0 viewHolder0 = (ViewHolder0)holder;
            ...
            break;

        case 2:
            ViewHolder2 viewHolder2 = (ViewHolder2)holder;
            ...
            break;
    }
}

详情请参考this link.