我正面临着一个奇怪的行为,将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
如果您遇到同样的问题,请为这些错误加注星标
答案 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);
}
注意:我并不是真的推荐使用这样的黑客,它不专业且不可维护,但你知道的越多......