Поиск и фильтрация работают отлично, но когда результат соответствует запросу пользователя, во-первых, в recyclerview есть только 1 представление, что мне и нужно. Однако, когда пользователь вводит в поиск больше текста, соответствующего одному и тому же представлению, отображается больше представлений, соответствующих одному и тому же объекту. в основном, после каждого изменения текста, если я жестко не запрограммирую ограничение на количество представлений, отображаемых в 'getItemCount()'
Ниже приведен код функции фильтра и функции query_listener().
//Filter
@Override
public Filter getFilter() {
return new Filter() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
protected FilterResults performFiltering(CharSequence user_input) {
FilterResults results = new FilterResults();
ArrayList<ExampleItem> arrayListFilter = new ArrayList<>();
if(user_input.length() == 0) {
results.count = arrayList.size();
results.values = arrayList;
} else {
for (ExampleItem api_data : arrayList) {
if(api_data.getName().toLowerCase().contains(user_input.toString().toLowerCase())) {
arrayListFilter.add(api_data);
if(arrayListFiltered.contains(api_data)){
arrayListFilter.remove(api_data);
}
}
}
results.count = arrayListFilter.size();
results.values = arrayListFilter;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
arrayListFiltered = (ArrayList<ExampleItem>) results.values;
notifyDataSetChanged();
// if(arrayListFiltered.() == 0) {
// Toast.makeText(context, "Not Found", Toast.LENGTH_LONG).show();
}
};
}
//FILTER ENDS
//query_listener
public void query_listener() {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String n) {
recyclerView.setVisibility(View.VISIBLE);
adapter.getFilter().filter(n);
show_srch(n);
return false;
}
});
}
//suppressing infinite views from displaying
int cnt=5;
@Override
public int getItemCount() {
if(arrayListFiltered.size()>cnt){
return cnt;
}else{
return arrayListFiltered.size();
}
}
//data binding
@Override
public void onBindViewHolder(@NonNull viewHolder viewHolder, int position) {// String data =
viewHolder.name.setText(arrayListFiltered.get(position).getName());
}
при первом совпадении пользовательского запроса
После добавления текста или пробела