Android 创建类似ViewPager的RecyclerView

Android 创建类似ViewPager的RecyclerView,android,android-viewpager,android-recyclerview,Android,Android Viewpager,Android Recyclerview,我使用的是一个ViewPager,其中每个页面都是一个类别,其中包含一个水平循环视图。每个RecyclerView都包含许多与其所在的ViewPager页面类别相关的项目。当然,当用户滚动时,如果包含更多要滚动到的项目,则会滚动到RecyclerView,否则会滚动到下一页/上一页(取决于滚动方向) 我希望这些RecyclerViews充当ViewPager(起初,第一个ViewPager的每个页面都包含另一个ViewPager,但它给了我糟糕的性能): 在每个RecyclerView中,每个“

我使用的是一个ViewPager,其中每个页面都是一个类别,其中包含一个水平循环视图。每个RecyclerView都包含许多与其所在的ViewPager页面类别相关的项目。当然,当用户滚动时,如果包含更多要滚动到的项目,则会滚动到RecyclerView,否则会滚动到下一页/上一页(取决于滚动方向)

我希望这些RecyclerViews充当ViewPager(起初,第一个ViewPager的每个页面都包含另一个ViewPager,但它给了我糟糕的性能):

在每个RecyclerView中,每个“页面”包含9个项目(分为3列),我希望用户只能“逐页”滚动到RecyclerView。这意味着,如果他在第一页,并扔到右边,他将 滚动至“第二页”(其中包含从位置9到17的项目)。此外,用户一次不能滚动超过一页

有没有办法顺利地做到这一点?我认为更简单的方法是使用并覆盖SnapHelper,但我必须承认,我不太确定如何继续实现预期结果


谢谢

从描述中,很难准确判断滚动行为应该发生在哪个方向,但以下内容应该让您知道该怎么做:

您可以将
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
}
...
在适配器的
onCreateViewHolder
方法中,根据提供的
viewType
返回可选的
ViewHolder
。为简洁起见,我将其作为
开关
语句来完成

@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

这将在垂直
RecyclerView
中提供水平滚动行为-当然,您可以通过为每个
RecyclerView
使用不同的
LinearLayoutManager
s来翻转它们,以另一种方式工作

要使其行为类似于
ViewPager
,您需要使用您在问题中提到的
SnapHelper

  • 将嵌套的
    RecyclerView
    适配器中列表项的宽度设置为
    match\u parent
    (在项目的XML布局中执行此操作)
  • 初始化
    LinearSnapHelper
    (支持库24.1),如下所示:

    SnapHelper snapHelper = new LinearSnapHelper();
    snapHelper.attachToRecyclerView(viewHolder.recyclerView);
    

  • 这将提供一种行为,用户一次只能看到一个项目,并允许用户在各个水平视图中翻页。

    是的,通常嵌套滚动容器(如ScrollView和ViewPager)需要特殊处理,通常将触摸事件委托给父级和子级,具体取决于您的操作。这是一个非常奇怪的实现,我不确定你所认为的可用性是否有效和/或可能,但有一个线索让你开始。那是什么线索?很难想象你想要做什么。它和这个相似吗?