14

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

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

我的 recyclerview 只是持有一个简单的字符串列表,并使用以下布局行为:@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

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

4

3 回答 3

15

谷歌刚刚发布了这个错误的解决方法,稍后会公开发布。

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

于 2017-11-06T12:46:10.117 回答
3

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

android:nestedScrollingEnabled="false"

我希望它对你有帮助。

于 2019-02-07T13:26:32.607 回答
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);
}

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

于 2018-06-05T19:18:18.023 回答