我的搜索视图不工作,不过滤结果(在回收者视图)



我的mainactivity2代码:

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

是我的mainactiy2代码,我想在其中实现搜索视图。这里有两个回收者的视角。一个是水平回收站视图,另一个是垂直回收站视图。我想在垂直回收器视图中使用搜索视图。

适配器代码:

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 "No Match Found">
是我代码中的else部分…看起来像是"if"条件不正常

提前感谢您的帮助

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

在您的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();
}
};

最新更新