按下键盘上的复选标记键时,可使用 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 进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

滚动时重复 TableView 上的复选标记

tableView上的复选标记[重复]

如何在单元格渲染后检查表格视图上的复选标记图标(附件视图)?

点击两次以突出显示收藏视图中的复选标记

设置静态表格视图单元格的复选标记

关闭 UITableView 静态单元格中的复选标记