SearchView + Filterable RecyclerView 让 SearchView 失去焦点
SearchView + Filterable RecyclerView make SearchView losing focus
我在同一布局中同时使用了 searchView
和 recyclerView
。
recyclerView
正在使用过滤器并且工作正常。
当我在 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 内部,您可能会想出一个动态设置此参数的解决方案(因此它会在更新前关闭焦点,并在更新后重新打开)。
我在同一布局中同时使用了 searchView
和 recyclerView
。
recyclerView
正在使用过滤器并且工作正常。
当我在 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 内部,您可能会想出一个动态设置此参数的解决方案(因此它会在更新前关闭焦点,并在更新后重新打开)。