Как отобразить одно представление в представлении переработчика после сопоставления параметра поиска?

avatar
Nessy
9 августа 2021 в 03:26
29
0
0

Поиск и фильтрация работают отлично, но когда результат соответствует запросу пользователя, во-первых, в 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());
    }



при первом совпадении пользовательского запроса

После добавления текста или пробела

Источник

Ответы (0)