【发布时间】:2017-09-27 16:04:20
【问题描述】:
我刚刚升级到 API 26 并支持库 26.0.2。但是我发现我的RecyclerView 项目在滚动后是不可点击的。如果您等待一秒钟,它将起作用。但是,如果您立即单击该项目,则不会。即使RecyclerView 根本没有滚动(例如已滚动到顶部)。
当我降级以支持库 25.4.0 时,一切都恢复正常了。
关键是我的RecyclerView 在CoordinatorLayout 中,并且在Toolbar 的AppBarLayout 上有一个SCROLL_FLAG_SCROLL 标志。如果我不使用这个标志,那么这个问题就会消失。所以我认为这是支持库 26 的隐藏行为变化。
我尝试将focusable="false" 添加到CoordinatorLayout,但仍然没有成功。
有没有办法禁用这种行为?因为点击两次触发点击事件真的很烦人。
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinateLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/fragmentAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp"
android:background="@null">
<include
android:id="@+id/dynamicActionBarHolder"
layout="@layout/dynamic_action_bar"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/pullToRefreshMailRecycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/mailRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
</android.support.design.widget.CoordinatorLayout>
编辑
我认为问题在于RecyclerView 的scrollState。当它停止滚动时,它不会立即更改为SCROLL_STATE_IDLE。查看RecyclerView的源代码,我发现有一个ViewFlinger控制滚动状态。当我向下滚动到顶部时,它不会立即调用setScrollState(SCROLL_STATE_IDLE),而是等待一段时间来触发此方法。我飞得越快,我需要等待的时间就越多。就像 RecyclerView 仍在后台滚动一样。因为scroller.isFinished() 没有在RecyclerView 触摸顶部时停止滚动后立即返回true。当它位于CoordinatorLayout 中时,可能是RecyclerView 的错误。
【问题讨论】:
-
能否删除
SwipeRefreshLayout中的app:layout_behavior再试一次? -
滚动后仍然无法点击。使其工作的唯一方法是将标志设置为 0,
setScrollFlags(0)。
标签: android android-recyclerview android-support-library android-coordinatorlayout