【问题标题】:my search View is not working, not filtering the result (in recycler View)我的搜索视图不起作用,没有过滤结果(在回收站视图中)
【发布时间】:2021-02-18 05:41:34
【问题描述】:

我的 mainAcivity2 代码:

  //for searchView
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                if(clientList.contains(query)){
                    adapter.getFilter().filter(query);
                }else{
                    Toast.makeText(MainActivity2.this,"No Match Found",Toast.LENGTH_SHORT).show();
                }
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {

                return false;
            }
        });
    }

它是我想要实现搜索视图的 mainActiviy2 代码。我在这里有 2 个回收站视图。一种是水平回收器视图,另一种是垂直回收器视图。我想在垂直回收视图中使用搜索视图。

我的适配器代码:

public class ClientAdapter extends RecyclerView.Adapter<ClientAdapter.ClientViewHolder> implements Filterable {

    private Context context;
    private List<Clientt> clienttList;
    List<Clientt> clienttListAll;

    public ClientAdapter(Context context, List<Clientt> clienttList) {
        this.context = context;
        this.clienttList = clienttList;
    }


    @NonNull
    @Override
    public ClientViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.view_item_client, parent, false);
        return new ClientAdapter.ClientViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ClientViewHolder holder, int position) {

        holder.textViewClientName.setText(clienttList.get(position).getClientName());
        holder.textViewClientNumber.setText(clienttList.get(position).getPhoneNumber());
        String s = clienttList.get(position).getClientName();
    }

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

    @Override
    public Filter getFilter() {
        return filter;
    }
    Filter filter=new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {

            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                clienttListAll = clienttList;
            } else {
                List<Clientt> filteredList = new ArrayList<>();
                for (Clientt row : clienttList) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getClientName().toLowerCase().contains(charString.toLowerCase()) || row.getPhoneNumber().contains(charSequence)) {
                        filteredList.add(row);
                    }
                }

                clienttListAll = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = clienttListAll;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

            clienttListAll = (ArrayList<Clientt>) filterResults.values;

            // refresh the list with filtered data
            notifyDataSetChanged();
        }
    };


    public class ClientViewHolder extends RecyclerView.ViewHolder {



            private TextView textViewClientName;
            private TextView textViewClientNumber;
            LinearLayout ly;


            public ClientViewHolder(@NonNull View itemView) {
                super(itemView);

                textViewClientName = itemView.findViewById(R.id.text_view_client_name);
                textViewClientNumber = itemView.findViewById(R.id.text_view_client_number);
                ly = itemView.findViewById(R.id.listtt_Client);


            }
        }
    }

当我运行我的应用程序时,每当我搜索任何“未找到匹配项”时,它总是会显示一个 toast。
它是我代码中的 else 部分......似乎“if”条件不起作用。

提前感谢您的帮助。

【问题讨论】:

  • 嗨,您尝试检查列表是否包含 String 对象,但您的列表包含 Client 对象而不是 String,因为您的 if 语句总是返回 false
  • 如果你真的需要 if 语句,你需要通过覆盖 equals 方法来更改 Client 类,并且在 if 语句中你应该使用类似if (listClient.contains (new Client (" client name query"))
  • 当我执行此更改时显示错误
  • 为什么不在构造函数中将项目设置为clientListAll?应该只操作过滤后的列表,而不是需要填充过滤列表的完整列表。

标签: java android android-studio searchview


【解决方案1】:

在 OnQueryTextListener 中返回 true

@Override
  public boolean onQueryTextSubmit(String query)
  {
      adapter.filter(query);
      return true;
  }

  @Override
  public boolean onQueryTextChange(String newText)
  {
      adapter.filter(query);
      return true;
  }

适配器

public class ClientAdapter extends RecyclerView.Adapter<ClientAdapter.ClientViewHolder>
{
    private Context context;
    private List<Clientt> clienttList;
    List<Clientt> clienttListAll;

    public ClientAdapter(Context context, List<Clientt> clienttList)
    {
        this.context = context;
        this.clienttList = clienttList;
        clienttListAll.addAll(clienttList);
    }


    @NonNull
    @Override
    public ClientViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(context).inflate(R.layout.view_item_client, parent, false);
        return new ClientAdapter.ClientViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ClientViewHolder holder, int position)
    {

        holder.textViewClientName.setText(clienttList.get(position).getClientName());
        holder.textViewClientNumber.setText(clienttList.get(position).getPhoneNumber());
        String s = clienttList.get(position).getClientName();
    }

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

    public void filter(String charText)
    {
        clienttList.clear();
        if (charText.length() == 0)
        {
            clienttList.addAll(clienttListAll);
        }
        else
        {
            for (Clientt row : clienttListAll)
            {
                // name match condition. this might differ depending on your requirement
                // here we are looking for name or phone number match
                if (row.getClientName().toLowerCase().contains(charString.toLowerCase()) || row.getPhoneNumber().contains(charSequence))
                {
                    clienttList.add(row);
                }
            }
        }
        
        notifyDataSetChanged();
    }


    public class ClientViewHolder extends RecyclerView.ViewHolder
    {
        private TextView textViewClientName;
        private TextView textViewClientNumber;
        LinearLayout ly;


        public ClientViewHolder(@NonNull View itemView)
        {
            super(itemView);

            textViewClientName = itemView.findViewById(R.id.text_view_client_name);
            textViewClientNumber = itemView.findViewById(R.id.text_view_client_number);
            ly = itemView.findViewById(R.id.listtt_Client);
        }
    }
}

【讨论】:

  • 您是否尝试过从适配器中删除可过滤器?
  • 现在在 charSequence 上显示未解析的引用,在适配器类中显示 charString 并在查询中显示错误,在 mainActivity 中显示 getFilter
  • 从 MainActivity 中移除 getFilter() 并调用 adapter.filter(query) this
  • 错误出现在 charSequence 和 charString...显示未解析的引用
  • 只需更换更新的适配器代码并再次检查
【解决方案2】:

在您的 ClientAdapter 中试试这个:

 public ClientAdapter(Context context, List<Clientt> clienttList)
{
    this.context = context;
    this.clienttList = clienttList;
    clienttListAll=new Arraylist<>(clienttList);
}

也添加这个:

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
         clientList.clear();
            clienttListAll.addAll((List) filterResults.values);

        // refresh the list with filtered data
        notifyDataSetChanged();
    }

如果没有任何效果,我会建议你试试这个完整的代码:

我的适配器代码:

 public class ClientAdapter extends RecyclerView.Adapter<ClientAdapter.ClientViewHolder> implements Filterable {

private Context context;
private List<Clientt> clienttList;
List<Clientt> clienttListAll;

public ClientAdapter(Context context, List<Clientt> clienttList) {
    this.context = context;
    this.clienttList = clienttList;
    clientListAll=new Arraylist<>(clientList);
}


@NonNull
@Override
public ClientViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.view_item_client, parent, false);
    return new ClientAdapter.ClientViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ClientViewHolder holder, int position) {

    holder.textViewClientName.setText(clienttList.get(position).getClientName());
    holder.textViewClientNumber.setText(clienttList.get(position).getPhoneNumber());
    String s = clienttList.get(position).getClientName();
}

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

@Override
public Filter getFilter() {
    return filter;
}
Filter filter=new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence charSequence) {
       List<Clientt> filteredList= new Arraylist<>();
        String charString = charSequence.toString();
        if (charString.isEmpty()) {
            filteredList.addAll(clienttListAll);
        } else {
            String filtered=charString.toLowerCase().trim();
            for (Clientt row : clienttList) {

                // name match condition. this might differ depending on your requirement
                // here we are looking for name or phone number match
                if (row.getClientName().toLowerCase().contains(filtered) || row.getPhoneNumber().contains(charSequence)) {
                    filteredList.add(row);
                }
            }

   
        }

        FilterResults filterResults = new FilterResults();
        filterResults.values = filteredList;
        return filterResults;
    }

    @Override
    protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
        clienList.clear();

        clienttList.addAll((List)filterResults.values);

        // refresh the list with filtered data
        notifyDataSetChanged();
    }
};

【讨论】:

  • 也这样做 @Override protected void publishResults(CharSequence charSequence, FilterResults filterResults) { clientList.clear(); clienttListAll.addAll((List) filterResults.values); // 用过滤后的数据刷新列表 notifyDataSetChanged(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2021-04-16
  • 2021-11-02
相关资源
最近更新 更多