#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(); }