如何从ScrollView中的RecyclerView中删除焦点?

时间:2016-06-16 05:30:22

标签: android android-recyclerview scrollview

我有一个包含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>

5 个答案:

答案 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)

从此处Android Dev Doc.

查看 clearFocus()

您可以将 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