按下键盘上的复选标记键时,可使用 RecyclerView 进行过滤
Posted
技术标签:
【中文标题】按下键盘上的复选标记键时,可使用 RecyclerView 进行过滤【英文标题】:Filterable with RecyclerView is cancelling when pressing checkmark key on keyboard 【发布时间】:2019-05-30 10:22:22 【问题描述】:我有一个 RecyclerView,它带有一个简单的基于字符串的名称列表。我将实现 Filterable 添加到我的类中,我可以使用搜索栏搜索/过滤结果。按软键盘上的箭头/输入键时出现问题。当您这样做时,它会完全取消搜索并返回到完整的名称列表。我已经搜索了如何使用 Filterable 类的示例,我完全符合我所看到的所有结果。我只是不知道如何使它在点击键盘上的复选标记/输入按钮时不取消。
如您所见,过滤工作正常,但是那个该死的箭头键取消了搜索结果并将我带回完整列表视图。
如果需要,这里是代码的相关部分...
public class VegetableListAdapter extends RecyclerView.Adapter<VegetableListAdapter.ViewHolder> implements Filterable
//...
private ArrayList<VegetableName> allNames;
private ArrayList<VegetableName> filteredNames;
class ViewHolder extends RecyclerView.ViewHolder
public TextView name;
public ViewHolder(View view)
super(view);
name = view.findViewById(R.id.name);
//...
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
final VegetableName name = filteredNames.get(position);
holder.name.setText(name.getName());
//...
@Override
public void getFilter()
return new Filter()
@Override
protected FilterResults performFiltering(CharSequence charSequence)
FilterResults results = new FilterResults();
String term = charSequence.toString();
Log.d("VegetableListAdapter", "Searching for string: " + term);
if(term.isEmpty())
filteredNames = allNames;
results.values = allNames;
results.count = allNames.size();
else
ArrayList<VegetableName> filteredList = new ArrayList<>();
for(VegetableName name : allNames)
if(name.getName().toLowerCase().contains(term.toLowerCase())
filteredList.add(name);
filteredNames = filteredList;
results.values = filteredNames;
results.count = filteredNames.size();
return results;
@Override
protected void publishResults(CharSequence sequence, FilterResults results)
Log.d("VegetableListAdapter", "publishing results of: " + sequence);
filteredNames = (ArrayList<VegetableName>) filterResults.values;
notifyDataSetChanged();
;
调用过滤器在此处的Activity中完成...
@Override
public boolean onCreateOptionsMenu(Menu menu)
getMenuInflater().inflate(R.menu.vegetable_list, menu);
SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
@Override
public boolean onQueryTextSubmit(String s)
adapter.getFilter().filter(s);
return false;
@Override
public boolean onQueryTextChange(String s)
adapter.getFilter().filter(s);
return false;
);
return true;
@Override
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if(id == android.R.id.home)
if(!searchView.isIconified())
searchView.setIconified(true);
return true;
return id == R.id.action_search || super.onOptionsItemSelected(item);
@Override
public void onBackPressed()
if(!searchView.isIconified())
searchView.setIconified(true);
return;
super.onBackPressed();
overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right);
我疯了,我不明白为什么那个愚蠢的箭头按钮会导致搜索取消并丢失结果。请帮帮我。谢谢
上面添加的 Log.d 行的 Logcat 输出...
【问题讨论】:
"but that darn checkmark cancels"
- 你的真正意思是什么“复选标记”?
哎呀,我的意思是那个该死的箭头。将编辑问题。对不起
好的,你在哪里打电话给adapter.getFilter().filter(...)
?仅在OnQueryTextListener#onQueryTextChange
?
在活动中,我忘了包括那部分。使用来自 Activity 的代码进行了更新。对不起......再次:)
ok 尝试将Log.d
的参数值传递给performFiltering
方法,你在logcat 上看到了什么?最后是用空的 CharSequence 调用的吗?
【参考方案1】:
我发现了问题。我正在寻找的教程让我添加了这一行
searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
这是在键盘上添加箭头键。当按下它正在使用 searchableInfo 查找结果时,当然没有,所以它只是返回列表。删除该行将箭头键变成了搜索键,现在它可以完美运行了。 只是想发布这个答案,以防其他人遇到这个问题。
【讨论】:
以上是关于按下键盘上的复选标记键时,可使用 RecyclerView 进行过滤的主要内容,如果未能解决你的问题,请参考以下文章