滚动时单击不在 CoordinatorLayout 中的 RecyclerView 上工作
Posted
技术标签:
【中文标题】滚动时单击不在 CoordinatorLayout 中的 RecyclerView 上工作【英文标题】:Click not working on RecyclerView in CoordinatorLayout when scrolling 【发布时间】:2018-04-02 10:34:09 【问题描述】:我正面临着一个奇怪的行为,将 RecyclerView 作为 CoordinatorLayout 的第二个孩子,紧随在 AppBarLayout 之后(如许多示例中所述)。
我的问题是当我滚动回收站视图并想单击特定项目时。有时我需要单击 2 次才能选择该项目,它似乎与投掷行为有关。例如,如果我滚动到回收器视图的底部,那么如果我将手指从屏幕底部弹到顶部(为了查看更多数据,但在我的情况下,我看不到更多数据,因为我我已经到了底部)然后快速点击一个项目,似乎停止了投掷,第二次点击实际上选择了该项目...... 当使用没有 CoordinatorLayout 的简单回收器视图时,这种行为显然不会发生。
我的 recyclerview 只是保存一个简单的字符串列表,并使用以下布局行为:@string/appbar_scrolling_view_behavior
你知道为什么吗?
[编辑] 我刚刚尝试了 android Studio 示例滚动活动,它看起来像是来自 Google 支持存储库的错误。 事实上,当使用支持版本 26.1.O(与 26.0.0 和 26.0.2 相同)时,我所说的 bug 是存在的,但如果您尝试使用 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
如果您遇到同样的问题,请为这些错误加注星标
【问题讨论】:
【参考方案1】:Google 刚刚发布了针对此错误的解决方法,稍后会公开发布。
https://gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2
【讨论】:
真的很有帮助 @gxela 现在公开发布了吗??【参考方案2】:如果在 NestedScrollView 中使用 RecyclerView,则将此行添加到 RecyclerView :
android:nestedScrollingEnabled="false"
希望对你有帮助。
【讨论】:
【参考方案3】:我也发现了这个问题......在浪费了这么多小时搜索和尝试不同的东西之后,我想出了一个技巧,它并不漂亮,但它也适用于其他人。
基本上这个想法是模拟对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);
注意:我真的不推荐使用这样的 hack,它不专业且无法维护,但你知道的越多……
【讨论】:
模拟点击(nestedScroll) ??什么是嵌套滚动??你是怎么得到的??以上是关于滚动时单击不在 CoordinatorLayout 中的 RecyclerView 上工作的主要内容,如果未能解决你的问题,请参考以下文章
Android - 在 CoordinatorLayout 中使用时页脚滚动到屏幕外
CoordinatorLayout 中的 RelativeLayout 不滚动
在 CoordinatorLayout Android 中的 ViewPager 片段中使用 NestedScrollView 突然滚动
Android CoordinatorLayout + AppbarLayout + Viewpager 总是滚动