SearchView +可过滤的RecyclerView使SearchView失去焦点

时间:2019-07-24 06:55:03

标签: android android-recyclerview searchview

我的searchViewrecyclerView的布局相同。 recyclerView正在使用过滤器,并且工作正常。

我在searchView上输入查询时发生了问题。输入我的查询的第一个字符后,searchView会失去焦点,而不是让我完成输入。假设我要显示名称中包含“ 1234”的所有项目,在我输入“ 1”之后searchView将失去焦点,然后显示包含“ 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;
            }
        });
    }

我在自定义警报对话框中有类似的布局,并且工作正常,没有任何问题。对吗?

2 个答案:

答案 0 :(得分:1)

如果您在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内,则可以找到一种解决方案,该解决方案可以动态设置此参数(因此在更新之前将其关闭,然后在更新之后将其重新打开)。

答案 1 :(得分:0)

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;
     }
});

将false更改为true。