滚动

时间:2017-10-21 11:47:12

标签: scroll android-recyclerview click android-collapsingtoolbarlayout coordinator-layout

我正面临着一个奇怪的行为,将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,它确实在工作......

Google有两个未解决的漏洞: https://issuetracker.google.com/u/1/issues/66996774 https://issuetracker.google.com/u/1/issues/68077101

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

3 个答案:

答案 0 :(得分:14)

Google刚刚发布了针对此漏洞的解决方法,稍后将公开发布。

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

答案 1 :(得分:3)

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

android:nestedScrollingEnabled="false"

希望对您有帮助。

答案 2 :(得分: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);
}

注意:我并不是真的推荐使用这样的黑客,它不专业且不可维护,但你知道的越多......