Android双向视图-Vertical Recyclerview中的Horizontal Recyclerview
我想创建一个动态加载视图,其中在vertical recyclerview内部包含horizontal 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步:为HorizontalViewBinder创建吸气剂
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.