【问题标题】:Searchview don't work properly with hidden recyclerview's itemsSearchview 不能与隐藏的 recyclerview 的项目一起正常工作
【发布时间】:2021-02-17 22:15:25
【问题描述】:

我的应用程序中有数据适配器,其中包含隐藏的 recyclerview 项目。我创建了过滤函数来搜索列表中的值。第一次搜索总是正确显示查询值。但接下来的搜索不会显示搜索到的值。我发现如果我折叠并再次打开搜索视图,问题就会消失。但仅限于第二次和下一次搜索...... P.S 如果没有隐藏recyclerview的物品,则不存在这种情况。

我正在从适配器发送我的OnBindViewHolder 函数并从活动中发送搜索函数。

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.CustomViewHolder> {

private List<ModelData> ModelList;
private List<ModelData> ListFull;
private Context mContext;
private boolean activate=false;



public DataAdapter(List<ModelData> ModelList, Context mCtx) {

    this.ModelList = ModelList;
    this.mContext = mCtx;
    ListFull = new ArrayList<>(ModelList);


public void onBindViewHolder(final CustomViewHolder holder, int position) {

    final ModelData result = ModelList.get(position);

    holder.status.setText(result.getStatus());
    if(holder.status.getText().equals("YYY")&& !activate){

        holder.itemView.setVisibility(View.GONE);
        holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(0, 0));
    }
    if(holder.status.getText().equals("YYY") && activate){
        holder.itemView.setVisibility(View.VISIBLE);
        holder.itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    }



}



@Override
public int getItemCount() {
    return ModelList.size();
}

public Filter getFilter() {
    return exampleFilter;
}


private Filter exampleFilter= new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<ModelData> filteredList= new ArrayList<>();

        if(constraint== null || constraint.length()==0){
            filteredList.addAll(ListFull);

        }else{

            String filePattern= constraint.toString().toLowerCase().trim();
            for(ModelData ModelData: ListFull){
                if(ModelData.getEventLabel().toLowerCase().contains(filePattern)){
                    filteredList.add(ModelData);
                }
            }
        }
        FilterResults filterResults= new FilterResults();
        filterResults.values= filteredList;

        return filterResults;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        ModelList.clear();
        ModelList.addAll((List)results.values);
        notifyDataSetChanged();
    }
};

}

活动

 @Override
public void onCreateOptionsMenu(@NonNull final Menu menu, MenuInflater inflater) {

    inflater.inflate(R.menu.menuLayout, menu);

    this.menu = menu;
    final MenuItem searchItem = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView) searchItem.getActionView();


    searchView.setQueryHint("type something");
    searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            biezaceAwarieAdapter.getFilter().filter(newText);
            ImageView searchViewIcon = searchView.findViewById(R.id.search_close_btn);
            searchViewIcon.setVisibility(View.GONE);

            return false;
        }

    });

    super.onCreateOptionsMenu(menu, inflater);
}

【问题讨论】:

    标签: android android-recyclerview searchview


    【解决方案1】:

    这样做:

              public class DataAdapter extends RecyclerView.Adapter<DataAdapter.CustomViewHolder>  implements Filterable{
    

    修改你的 for each 循环:

      for(ModelData ModelData: ListFull)
    

       for(ModelData modeldata: ListFull)
    

    新代码应该是:

          String filePattern= constraint.toString().toLowerCase().trim();
            for(ModelData modeldata: ListFull){
                if(modeldata.getEventLabel().toLowerCase().contains(filePattern)){
                    filteredList.add(modeldata);
                }
            }
    

    【讨论】:

    • 你能告诉我,这个改变有什么帮助吗?
    • 实际的问题是你还没有在你的DataAdapter中实现Filterable。
    • 检查我更新的答案。这次它将在 Sha Allah 中起作用
    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2018-11-10
    • 2014-07-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多