мой вид поиска не работает, не фильтрует результат (в режиме рециркуляции)

#java #android #android-studio #searchview

#java #Android #android-студия #searchview

Вопрос:

Мой код 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);


            }
        }
    }

 

Когда я запускаю свое приложение, всякий раз, когда я ищу что-либо, всегда отображается всплывающее окно «Совпадение не найдено».
это часть else в моем коде … похоже, что условие «если» не работает.

Заранее благодарю вас за вашу помощь.

Комментарии:

1. Привет, вы пытаетесь проверить, содержит ли список объект String, но ваш список содержит объект Client, а не строку, для этого ваш оператор if возвращает всегда false

2. Если вам действительно нужен оператор if, вам нужно изменить класс клиента, переопределив метод equals, а в операторе if вы должны использовать что-то вроде if (listClient.contains (new Client (" client name query"))

3. при выполнении этих изменений отображается ошибка

4. Почему вы не устанавливаете значения элементов clientListAll в конструкторе? Следует манипулировать только отфильтрованным списком, а не полным списком, который необходим для заполнения отфильтрованного списка.

Ответ №1:

верните true в вашем OnQueryTextListener

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

Комментарии:

1. вы пытались удалить filterable из адаптера?

2. теперь отображается неразрешенная ссылка на CharSequence, charString в классе адаптера и отображается ошибка при запросе и getFilter в MainActivity

3. удалите getFilter() из MainActivity и вызовите adapter.filter(query) это

4. ошибка в CharSequence и charString… отображение неразрешенной ссылки

5. просто замените обновленный код адаптера и проверьте еще раз

Ответ №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();
    }
};
 

Комментарии:

1. Сделайте это также @Override protected void publishResults(CharSequence CharSequence, FilterResults filterResults) { clientList.clear(); clientlistall.addAll((Список) filterResults.values); // обновите список отфильтрованными данными notifyDataSetChanged(); }