在滚动

时间:2017-09-29 17:56:46

标签: android android-recyclerview scrollview

我有RecyclerView。在其适配器onBindViewHolder()内部,我将OnClickListener设置为ViewHolder的根布局。

但是,我最近发现,在滚动时,我无法点击RecyclerView个项目。只有在它停止之后。如果我在点击RecyclerView时单击某个位置,RecyclerView仅在该位置停止,则不会点击任何项目。

您可以在Gmail应用中看到我的意思。滚动RecyclerView时,您无法打开任何电子邮件。

但是,Google Play应用的行为有所不同。您可以在滚动应用列表的同时打开应用页面。您甚至可以在滚动父RecyclerView时水平滚动内部RecyclerView

我也注意到了ScrollView的相同行为。例如,如果您在其中放置了很多按钮并开始滚动它,则不会触发按钮侦听器。只有在ScrollView完全停止后才能触发它们。

您是否知道如何实现Google Play应用中的行为?谢谢!

4 个答案:

答案 0 :(得分:1)

以下是Kimi Chiu在a related question中编写的代码:

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean requestCancelDisallowInterceptTouchEvent = getScrollState() == SCROLL_STATE_SETTLING;
    boolean consumed = super.onInterceptTouchEvent(event);
    final int action = event.getActionMasked();

    switch (action) {
        case MotionEvent.ACTION_DOWN:
            if( requestCancelDisallowInterceptTouchEvent ){
                getParent().requestDisallowInterceptTouchEvent(false);
                // stop scroll to enable child view get the touch event
                stopScroll();
                // not consume the event
                return false;
            }
            break;
    }

    return consumed;
}

如果您继承RecyclerView类并重写此方法,则其行为与问题相同。

答案 1 :(得分:0)

您需要在滚动父级内部启用“嵌套滚动”标志。如果您希望在垂直滚动父回收器视图中使用水平滚动回收器视图,这通常是您要执行的操作。您可以对任何滚动视图执行此操作。

答案 2 :(得分:0)

不要这样做。想想用户体验。您希望能够允许用户滚动而不会意外地单击以打开新窗口或详细信息。 Android用户希望滚动以防止点击。停止后,您希望单击以显示详细信息。如果您希望通过覆盖onTouch并决定如何处理触摸事件(如果它提供给回收器视图或行项目),您当然可以实现此目的,但我认为您正在创建糟糕的用户体验。我尝试了应用程序商店,当你触摸它时停止它也不确定在打开单击或水平滚动时滚动的含义是因为如果我垂直滚动然后向左滑动它只会更改页面查看器。

所以也许不是你想要的答案,但我认为用户体验比“滚动时触摸的酷炫效果”管理更重要。如果Android希望它成为他们的操作系统体验,它将被内置。现在不是像可转换行项目那样的情况,但是默认的主要细节列表处理非常标准化。

答案 3 :(得分:0)

仅在不滚动时使recyclerView对单击事件做出反应:

if (recyclerView.scrollState == SCROLL_STATE_IDLE) {
    onItemClicked()
}