【发布时间】: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