从描述中,很难准确地告诉滚动行为应该发生在哪个方向,但以下内容应该让您知道该怎么做:
您可以将 RecyclerView 作为项目嵌套在您的 RecyclerView 中。
在适配器的onCreateViewHolder 方法中,根据提供的viewType 返回替代ViewHolder。为简洁起见,我将其作为switch 声明完成。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case REGULAR_ITEM:
return new RegularItemViewHolder(getRowView(parent, R.layout.list_item_regular);
case NESTED_LIST_TYPE:
return new NestedRecyclerViewHolder(getRowView(parent, R.layout.list_item_nested_recycler);
...
}
protected View getRowView(ViewGroup parent, @LayoutRes final int layoutRes) {
return layoutInflater.inflate(layoutRes, parent, false);
}
ViewHolder
public class NestedRecyclerViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.my_nested_recyclerview)
public RecyclerView recyclerView;
public NestedRecyclerViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
然后在onBindViewHolder 中,您可以使用水平的LinearLayoutManager 设置这个嵌套的RecyclerView(假设您有一个垂直的父RecyclerView,您希望其中的一个或多个行是水平的RecyclerView)。
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// find the item type based on the position
if(rowType == NESTED_LIST_TYPE) {
NestedRecyclerViewHolder viewHolder = (NestedRecyclerViewHolder)holder;
viewHolder.recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
viewHolder.recyclerView.setAdapter(new MyAdapter());
// continue to set up the nested `RecyclerView` as you would a regular one
}
...
这将在垂直 RecyclerView 中提供水平滚动行为 - 当然,您可以通过为每个 RecyclerViews 使用不同的 LinearLayoutManagers 来翻转它们以以其他方式工作。
要使其表现得像ViewPager,您需要使用您在问题中提到的SnapHelper:
- 将嵌套
RecyclerView 的适配器中的列表项的宽度设置为match_parent(在项目的 XML 布局中执行此操作)。
-
像这样初始化LinearSnapHelper(支持库 24.1):
SnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(viewHolder.recyclerView);
这将为您提供用户一次只能看到一项的行为,并允许用户翻阅各个水平视图。