【问题标题】:Android two way view - Horizontal Recyclerview inside Vertical RecyclerviewAndroid 双向视图 - Vertical Recyclerview 内的 Horizo​​ntal Recyclerview
【发布时间】:2018-03-18 07:00:36
【问题描述】:

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

 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? 请给我一些很好的例子。

【问题讨论】:

  • 仅从您的层次结构来看,我可以说您将面临滚动内滚动的问题,并且如果您的视图寻呼机没有固定高度,则可能不会显示片段的内容。您能否使视图寻呼机与滚动视图一起使用?我无法帮助您解决延迟加载问题,但如果您有滚动问题,也许我可以帮助您。
  • 这是一个简单的项目,用于修复这种视图寻呼机的滚动视图问题:github.com/roni-castro/multiple-scroll-solution
  • @RoniCastro 你认为这会解决滚动行为的问题吗?
  • 需要查看代码或布局,但是view pager的主要问题是它不能很好地与scrollView或nestedScrollView一起使用,并且片段内部有一个回收器视图这是必要的通过设置属性 setNestedScrollingEnable(false) 来删除它的滚动以避免缓慢滚动。如果您需要对 recyclerview 的项目进行分页,这可能是另一个问题。

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


【解决方案1】:

最好的方法是使用RendererRecyclerViewAdapter

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

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

它是你的横向项目,里面包含所有简单的项目。

第四步:创建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 创建一个 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 页面:简单项目、复合项目、加载更多指示器。

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多