【问题标题】:Creating a RecyclerView that acts like a ViewPager创建一个类似于 ViewPager 的 RecyclerView
【发布时间】:2016-11-22 16:01:14
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 是的,通常嵌套像 ScrollView 和 ViewPager 这样的可滚动容器需要特殊处理,通常将触摸事件委托给父级和子级,具体取决于您在做什么。这是一个非常奇怪的实现,我不确定您认为的可用性是否有效和/或可能,但您有一个开始的线索。
  • 那是什么线索?
  • 很难想象你想做什么。是不是和这个类似:stackoverflow.com/q/47514072/878126?

标签: android android-viewpager android-recyclerview


【解决方案1】:

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

您可以将 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:

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

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

这将为您提供用户一次只能看到一项的行为,并允许用户翻阅各个水平视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 2013-11-07
    • 2016-12-11
    • 1970-01-01
    • 2011-06-13
    • 2015-06-16
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多