我有一个包含ImageView和RecyclerView的Scrollview。 如果导航抽屉打开然后关闭RecyclerView自动滚动到顶部,如何停止?
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollViewMain"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView_main_icons_line"
android:src="@drawable/main_line" />
...
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView_activity_main_passenger_log"
android:paddingBottom="2dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
答案 0 :(得分:43)
这个问题因为recyclerView有默认焦点。
解决方案
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
将android:descendantFocusability="blocksDescendants"
添加到您的scrollView
答案 1 :(得分:16)
这是因为RecyclerView总是设置:
setFocusableInTouchMode(true);
这在构造函数中是硬编码的。
因此,如果您在XML中为RecyclerView应用这些属性
android:focusable="false"
android:focudeableInTouchMode="false"
这将是无用的,你最终得到recycleView.isFocusable()== true ...
因此,最优雅的解决方案是禁用RecyclerView的父母可以使用。
<LinearLayout
android:focusable="false"
android:focusableInTouchMode="false"
android:descendantFocusability="blocksDescendants"
...
>
<android.support.v7.widget.RecyclerView
...
/>
/>
或者你可以只设置setFocusable(false)
答案 2 :(得分:2)
您可以将 DrawerListener 设置为导航抽屉,并使用 onDrawerStateChanged()或here中的其他一些选项来调用 clearFocus () RecyclerView 。
答案 3 :(得分:0)
只需在线性布局中添加以下代码,100%工作:android:descendantFocusability =&#34; blocksDescendants&#34;
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<LinearLayout
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="match_parent">
答案 4 :(得分:0)
添加android:descendantFocusability="blocksDescendants"
可以将滚动限制为recylerview,但是如果布局中包含edittext,则此属性也可以阻止该特定edittext的焦点。因此,如果您正在使用此属性,请确保在加载布局后立即在kotlin / java类中删除此属性。
parentLayout?.descendantFocusability = FOCUS_BEFORE_DESCENDANTS
(view as ViewGroup).descendantFocusability = FOCUS_BEFORE_DESCENDANTS