Android 两种方式 View - Horizo​​ntal Recyclerview inside Vertical Recyclerview

标签 android android-recyclerview scrollview lazy-loading android-scrollview

我想创建一个动态加载 View ,其中包含垂直recyclerview内的水平recyclerview,垂直recyclerview应位于Scrollview内,因为主视图包含更多 View 组件。 所以我的动态层次结构如下:-

 Scrollview [
  | Viewpager --
  | AdView --
  | Vertical Items - Recyclerview {
       1) [Horizontal Recyclerview {1.1, 1.2, 1.3} [Lazy Loading of Items]]
       2) [Horizontal Recyclerview {2.1, 2.2, 2.3} [Lazy Loading of Items]]
       3) [Horizontal Recyclerview {3.1, 3.2, 3.3} [Lazy Loading of Items]]
       4) [Horizontal Recyclerview {4.1, 4.2, 4.3} [Lazy Loading of Items]]
       .
       .
       .
    [Lazy Loading of Items in Vertical Direction also]
       }
   | Some Another View --
          ]

有没有最好的方法可以在 android 中实现这种类型的 View 。那么水平和垂直方向都可以实现元素的动态加载吗? android 中有可用的库吗? 请给我推荐一些很好的例子。

最佳答案

最好的方法是使用 RendererRecyclerViewAdapter

第 1 步:ViewModel 接口(interface)添加到您的简单项目

public class SimpleItem implements ViewModel {
    /* your getters */
}

第 2 步:为您的简单项目创建 ViewBinder

private ViewRenderer getSimpleViewBinder() {
    return new ViewBinder<>(
        R.layout.simple_item, /* your item layout */
        SimpleItem.class, /* your model class */
        (model, finder, payloads) -> {
            /* your binding */
            finder.setText(R.id.textView, model.getText());
    });
}

第 3 步:扩展 DefaultCompositeViewModel 并添加水平项目的唯一 ID

public class HorizontalViewModel extends DefaultCompositeViewModel {

    private int mID;

    public HorizontalViewModel(int ID, List<? extends ViewModel> items) {
        super(items);
        mID = ID;
    }

    public int getID() {
        return mID;
    }
}

这是您的水平项目,其中包含所有简单项目。

第 4 步:创建 Horizo​​ntalViewBinder

public class HorizontalViewBinder extends CompositeViewBinder<HorizontalViewModel> {

    public HorizontalViewBinder(int layoutID,
                                int recyclerViewID,
                                Class<HorizontalViewModel> type) {
        super(layoutID, recyclerViewID, type);
    }

    @Override
    public void bindView(HorizontalViewModel model, CompositeViewHolder holder) {
        super.bindView(model, holder);
        holder.getRecyclerView().addOnScrollListener(new EndlessScrollListener() {
            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                holder.getAdapter().showLoadMore();
                /* sendLoadMoreRequest(model.getID()); */
            }
        });
    }

    @NonNull
    @Override
    public CompositeViewHolder createViewHolder(ViewGroup parent) {
        final CompositeViewHolder viewHolder = super.createViewHolder(parent);
        viewHolder.getAdapter().registerRenderer(new LoadMoreViewBinder(R.layout.load_more)); 
        /* don't forget to create load more layout */
        return viewHolder;
    }
}

第 5 步:为 Horizo​​ntalViewBinder 创建 getter

private ViewRenderer getHorizontalViewBinder() {
    return new HorizontalViewBinder<>(
        R.layout.horizontal_layout, /* your horizontal layout that contains RecyclerView */
        R.id.recycler_view, /* an ID of RecyclerView */
        HorizontalViewModel.class /* your created class, see Step 3 */
    );
}

第 6 步:在 Fragment/Activity 中初始化主 RendererRecyclerViewAdapter

RendererRecyclerViewAdapter mRecyclerViewAdapter = new RendererRecyclerViewAdapter();
mRecyclerViewAdapter.registerRenderer(new Horizontal().registerRenderer(getHorizontalViewBinder().registerRenderer(getSimpleViewBinder())); /* register HorizontalViewBinder and SimpleViewBinder */
mRecyclerViewAdapter.setItems(getYourList());

第 7 步:将 LoadMoreListener 添加到主 RecyclerView

mRecyclerView.addOnScrollListener(new EndlessScrollListener() {
    @Override
    public void onLoadMore(int page, int totalItemsCount) {
        mRecyclerViewAdapter.showLoadMore();
        /* send request to a server */
    }
});

第 8 步:为您的其他项目创建特殊的 ViewBinder:AdViewBinder、SomeAnotherViewBinder 并将它们注册到您的适配器中。请参阅步骤 1 和步骤 2。


仅供引用:EndlessScrollListener - 这是您的 LoadMoreListener 实现

享受吧! :)

如果您需要更多详细信息,请参阅 wiki 页面:简单项目、复合项目、加载更多指示器。

关于Android 两种方式 View - Horizo​​ntal Recyclerview inside Vertical Recyclerview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49345312/

相关文章:

android - FirebaseRecyclerAdapter 与 gridlayoutmanager

android - LinearLayout 和 Webview 在 ScrollVIew 中的大小不一样

c# - 滚动条的样式不起作用

android - 如何访问 onDataChange 完成后返回的值?

android - 是否需要在 android list 中设置最大值?

android - 如何在 Android 上保存和比较 2 个指纹

android - RecyclerView - 倒置镜像(或 : let items stick to bottom)

java - 在 RecyclerView.Adapter 内部滚动到位置

widget - 在 Flutter 中实现双向 ListView

android - 如何使用Gradle任务正确上传文件?