滚动时,单击不在CoordinatorLayout中使用RecyclerView

问题描述 投票:12回答:3

我正面临着一个奇怪的行为,将RecyclerView作为CoordinatorLayout的第二个孩子,就在AppBarLayout之后(如很多例子中所述)。

我的问题是当我滚动回收器视图并且我想要点击特定项目时。有时我需要点击2次来选择该项目,它似乎与投掷行为有关。例如,如果我滚动到回收器视图的底部,那么如果我将手指从屏幕底部扔到顶部(为了查看更多数据,但在我的情况下,我看不到更多数据,因为我我已经到了底部)然后快速点击一个项目,它似乎停止了投掷,第二次点击实际上选择了项目...当使用没有CoordinatorLayout的简单回收站视图时,显然不会发生这种行为。

我的recyclerview只是持有一个简单的String列表,并使用以下布局行为:@ string / appbar_scrolling_view_behavior

你知道为什么吗?

[编辑]我刚刚尝试使用Android Studio示例滚动活动,看起来它是来自Google支持存储库的错误。事实上,当使用支持版本26.1.O(与26.0.0和26.0.2相同)时,我所讨论的错误存在,但如果您尝试使用版本26.0.0-alpha1或26.0.0-beta1,它实际上正在......

谷歌有两个公开的错误:https://issuetracker.google.com/u/1/issues/66996774 https://issuetracker.google.com/u/1/issues/68077101

如果您遇到同样的问题,请为这些错误加注星标

scroll android-recyclerview click android-collapsingtoolbarlayout coordinator-layout
3个回答
15
投票

谷歌刚刚发布了这个漏洞的解决方法,它将在稍后公开发布。

https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2


3
投票

如果在NestedScrollView中使用RecyclerView将此行添加到RecyclerView:

android:nestedScrollingEnabled="false"

我希望它对你有所帮助。


0
投票

我也发现了这个问题......在浪费了这么多时间搜索并尝试不同的东西之后,我拿出了一个技巧,它并不漂亮,但它也适用于其他人。

基本上这个想法是模拟对nestedScrollView的点击。 在我的情况下,在我检测到'AppBarLayout'完全展开之后,我向嵌套发送了一个水龙头。

protected void onCreate(final Bundle savedInstanceState) {

    getAppBarLayout().addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

      @Override
      public void onOffsetChanged(final AppBarLayout appBarLayout, final int verticalOffset) {

          if (verticalOffset == 0) { 
              // State.EXPANDED
              simulatedClick(nestedScroll)
          } else if (Math.abs(verticalOffset) >= appBarLayout.getTotalScrollRange()) { 
              // State.COLLAPSED
          } else { 
              // State.IDLE
          }
      }
  });
}

private void simulatedClick(@NonNull final View view) {
    // Obtain MotionEvent object
    final long downTime = SystemClock.uptimeMillis();
    final long eventTime = SystemClock.uptimeMillis() + 100;
    final MotionEvent motionEvent = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
    // Dispatch touch event to view
    view.dispatchTouchEvent(motionEvent);
}

注意:我不建议使用这样的黑客,这是不专业和不可维护的,但你知道的越多......

© www.soinside.com 2019 - 2024. All rights reserved.