我有一个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();
}
};
}
在此处的活动中完成过滤器的调用...
@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);
}
我疯狂地呆在这里,我不明白为什么那个愚蠢的箭头按钮导致搜索取消并丢失结果。请帮帮我。谢谢
答案 0 :(得分:0)
我发现了问题。我正在寻找的教程中添加了行
searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));
将箭头键添加到键盘上。当按下它时,它使用searchableInfo查找结果,当然没有结果,因此它只是返回到列表。删除该行后,箭头键变成了搜索键,现在可以正常使用了。 只是想发布此答案,以防其他人遇到此问题。