2016-11-20 79 views
0

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

我想这些RecyclerViews作为ViewPagers(在第一,ViewPager的每个页面包含在另一个ViewPager,但它给了我表现不好):

在每RecyclerView,每个“页面”包含9项目(分为3列),我希望用户只能滚动到“逐页”的RecyclerView。这意味着如果他在第一页并且向右转,他会滚动到“第二页”(其包含从第9位到第17位的项目)。另外,用户不应该一次能滚动多页。

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

谢谢!

+0

是的,通常像ScrollView和ViewPager这样的嵌套可滚动容器需要特殊处理,通常根据你在做什么将触摸事件委托给父母和孩子。这是一个相当奇怪的实现,我不确定你所想的可用性是否有效和/或可能,但是你有一个线索可以开始。 – Chisko

+0

那是什么线索? – IKIKN2

+0

很难想象你想要做什么。是否与此类似:https://stackoverflow.com/q/47514072/878126? –

回答

3

从描述中,这是很难说究竟应该发生的方向滚动的行为,但下面应该给你做什么的想法:

可以嵌套内的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你可以设置这个嵌套RecyclerView与水平LinearLayoutManager(这是假设你有一个垂直父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水平滚动行为 - 当然,你可以翻转这些通过使用不同的LinearLayoutManager S代表每个RecyclerView S在其他的方式来解决。

为了使它像一个ViewPager,你需要使用SnapHelper,你提到你的问题:

  1. 设置列表项的宽度在嵌套RecyclerView的适配器match_parent (在项目的XML布局中执行此操作)。
  2. 初始化LinearSnapHelper(支持库24。1)所示:

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

这会给你的行为,其中用户只能看到一个项目的时间和允许通过单独的水平视图的用户页面。

相关问题