【问题标题】:Horizontal Recyclerview inside a Vertical Scrollview垂直滚动视图中的水平 Recyclerview
【发布时间】:2015-07-07 09:43:55
【问题描述】:

我有一个 Recyclerview 在 ScrollView 内水平滑动的情况。现在的情况是,当我在 Recyclerview 上进行水平滑动时,不是滚动 Recyclerview 中的卡片视图,而是向上滚动屏幕,这会干扰用户体验。

当人们在 Recyclerview 上进行水平滑动时,有什么解决方案或方法可以避免垂直滚动?

【问题讨论】:

  • 这是一个典型的scrollable in scrollable scroll-conflict。以及您应该从不以这种方式设计布局的原因。
  • 我知道 Google 设计指南不鼓励这样做,但是有一些合法的用例,当它的数量超过 5 时,需要在一行中显示多个项目,而不是将其分成 3 行。通过将 3 行减少为单行的想法是,屏幕中的所有内容都可以一次性突出显示并可见,而无需用户滚动到底部。有时由于房地产空间有限,在第二行之后,当它下面的最后一个部分完全不可见时,用户可能会认为会有报价,并会离开屏幕。
  • [已解决] 在此处解决了水平滚动视图中的垂直回收器视图,可以类似地完成:stackoverflow.com/a/37619660/1303639

标签: android android-scrollview android-recyclerview android-cardview


【解决方案1】:

这个问题是由于scroll_conflicts而发生的正如Frank所说。但我知道有时我们需要超越设计准则。顺便说一句,您可以禁止 ScrollView(我将其作为 RecyclerView 的父级)拦截任何触摸事件。以下是此示例的代码示例。

mRecyclerView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    switch (action) {
                        case MotionEvent.ACTION_DOWN:
                            // Disallow ScrollView to intercept touch events.
                            v.getParent().requestDisallowInterceptTouchEvent(true);
                            break;
                        case MotionEvent.ACTION_UP:
                            //Allow ScrollView to intercept touch events once again.
                            v.getParent().requestDisallowInterceptTouchEvent(false);
                            break;
                    }
                    // Handle RecyclerView touch events.
                    v.onTouchEvent(event);
                    return true;
                }
            });

希望这能解决您的问题。但首先请检查您的 LayoutManager。如果你明确地使用带有水平布局的 LinearLayoutManager,我认为不需要上面的代码。

【讨论】:

    【解决方案2】:

    解决方案其实很简单。 将水平 RecycleView 作为一个项目放在 RecycleView 中,而不是使用滚动视图。 然后当您滚动它时,它会按照您的意愿行事。 这就是我所做的,并且效果很好

    【讨论】: