按下键盘上的对勾键时,可取消使用RecyclerView进行过滤

时间:2019-01-03 19:50:29

标签: android android-recyclerview android-filterable

我有一个RecyclerView,带有一个基于字符串的简单名称列表。我在类中添加了Filterable工具,并且可以使用搜索栏搜索/过滤结果。当按下软键盘上的箭头/输入键时,就会出现问题。当您这样做时,它会完全取消搜索并返回到完整的名称列表。我搜索了有关如何使用Filterable类的示例,并且完全符合我所看到的所有结果。我只是不知道如何在按下键盘上的对勾/输入按钮时使其不被取消。 enter image description here

过滤功能如您所见,但该死的箭头键会取消搜索结果,并带我回到完整列表视图。

如果需要,这里是代码的相关部分...

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

我疯狂地呆在这里,我不明白为什么那个愚蠢的箭头按钮导致搜索取消并丢失结果。请帮帮我。谢谢

上面添加的Log.d行的Logcat输出... enter image description here

1 个答案:

答案 0 :(得分:0)

我发现了问题。我正在寻找的教程中添加了行

searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));

将箭头键添加到键盘上。当按下它时,它使用searchableInfo查找结果,当然没有结果,因此它只是返回到列表。删除该行后,箭头键变成了搜索键,现在可以正常使用了。 只是想发布此答案,以防其他人遇到此问题。