Android双向视图-Vertical Recyclerview中的Horizo​​ntal Recyclerview [英] Android two way view - Horizontal Recyclerview inside Vertical Recyclerview

查看:116
本文介绍了Android双向视图-Vertical Recyclerview中的Horizo​​ntal Recyclerview的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个动态加载视图,其中在vertical recyclerview内部包含horizo​​ntal recyclerview,而vertical recyclerview应该在Scrollview内部,因为主视图包含更多视图组件. 所以我的动态层次结构如下:-

I want to create a dynamic loading view that contains horizontal recyclerview inside vertical recyclerview and vertical recyclerview should be inside Scrollview as the main view contains some more views components. So my dynamic hierarchy is as following:-

 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中实现这种类型的视图.那么可以同时在水平和垂直方向上实现物品的动态装载吗? android中有可用的lib吗? 请给我推荐一些很好的例子.

Is there any best way to achieve this type of view in android. So dynamic loading of items can be achieved in both horizontal and vertical directions ? Are there any lib available in android ? Please suggest me some good examples of this.

推荐答案

最好的方法是使用 RendererRecyclerViewAdapter

第1步:ViewModel界面添加到您的简单项目中

Step 1: add ViewModel interface to your simple item

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

步骤2:为您的简单商品创建ViewBinder

Step 2: Create ViewBinder for your simple item

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

Step 3: Extend DefaultCompositeViewModel and add an uniq ID of your horizontal item

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;
    }
}

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

It is your Horizontal item that contains all simple items inside.

步骤4:创建HorizontalViewBinder

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创建吸气剂

Step 5: Create a getter for your HorizontalViewBinder

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

Step 6: Initialize in your Fragment/Activity the main RendererRecyclerViewAdapter

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

第7步:将LoadMoreListener添加到主RecyclerView

Step 7: Add LoadMoreListener to main 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.

Step 8: Create specials ViewBinders for other your items: AdViewBinder, SomeAnotherViewBinder and register them in your adapter. See the Step 1 and the Step 2.

FYI: EndlessScrollListener -这是您对LoadMoreListener的实现

FYI: EndlessScrollListener - it is your implementation of LoadMoreListener

享受! :)

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

If you need more details please see wiki-pages: Simple Items, Composite Items, Load More Indicator.

这篇关于Android双向视图-Vertical Recyclerview中的Horizo​​ntal Recyclerview的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆