SearchView + Filterable RecyclerView 让 SearchView 失去焦点

SearchView + Filterable RecyclerView make SearchView losing focus

我在同一布局中同时使用了 searchViewrecyclerViewrecyclerView 正在使用过滤器并且工作正常。

当我在 searchView 上输入查询时出现问题。在我输入查询的第一个字符后,searchView 不会让我完成输入,而是会失去焦点。假设我想显示名称中包含“1234”的所有项目,searchView 将在我输入“1”然后显示所有包含“1”的项目后失去焦点。如果我想继续,我必须再次单击 searchView

这是我的布局(片段):

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.SearchView
            android:id="@+id/sv_test"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@android:color/transparent"
            android:inputType="number"
            app:iconifiedByDefault="false"
            app:queryBackground="@android:color/transparent"
            app:queryHint="Hint"
            app:theme="@style/AppSearchView">

        </android.support.v7.widget.SearchView>

        <View
            android:id="@+id/divider50"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/light_grey"
            android:visibility="visible" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

这是我的过滤命令:

private void setSearchview() {
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                adapter.getFilter().filter(query);

                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                adapter.getFilter().filter(query);

                return false;
            }
        });
    }

我在自定义警报对话框中有类似的布局,它工作正常,没有任何问题。很奇怪吧?

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
     @Override
     public boolean onQueryTextSubmit(String query) {
       adapter.getFilter().filter(query);
       return true;
     }

     @Override
     public boolean onQueryTextChange(String query) {
       adapter.getFilter().filter(query);
       return true;
     }
});

将错误更改为正确。

如果您的 RecyclerView 中有一个可聚焦的项目(如 EditText),它可能会在第一次更新时窃取焦点。 要禁用 RecyclerView 获得任何焦点,您可以将 descendantFocusability 参数添加到 XML,如下所示:

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_test"
        android:layout_width="match_parent"
        android:descendantFocusability="blocksDescendants"
        android:layout_height="wrap_content" />

如果您需要将焦点放在 RecyclerView 内部,您可能会想出一个动态设置此参数的解决方案(因此它会在更新前关闭焦点,并在更新后重新打开)。