android SearchView возвращает результаты из массива, но не обновляет новую информацию - PullRequest
0 голосов
/ 26 мая 2020

Итак, попытка отфильтровать RecyclerView с помощью searchview, что вроде работает, однако небольшая ошибка, которую я обнаружил, заключается в том, что результат просто заполняет информацию из первого элемента в RecyclerView, однако при нажатии или обновлении экрана sh показывает правильная информация, которую искали, я предполагаю, что это как-то связано с androidx, поскольку учебник, которому я следил, был до androidx.

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);
        MenuItem searchItem = menu.findItem(R.id.search);
        adapter = new adapter(mainDishes.this, recipes);
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });
        return true;
    }

    @Override
    public Filter getFilter() {
        return exampleFilter;
    }

    private Filter exampleFilter = new Filter() {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Recipes> Filtered = new ArrayList<>();
            if (constraint == null || constraint.length()== 0){
                Filtered.addAll(mRecipesFiltered);
            }else{
                String FilterPattern = constraint.toString().toLowerCase().trim();

                for (Recipes item : mRecipesFiltered){
                    if(item.getmrecipeName().toLowerCase().contains(FilterPattern)){
                        Filtered.add(item);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = Filtered;
            return results;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults results) {
            mRecipes.clear();
            mRecipes.addAll((List)results.values);
            notifyDataSetChanged();

        }
    };
}

Я слежу за учебниками codinginflow.com по этому поводу, и он работает, но просто вылетел, не зная, с чего начать.

1 Ответ

0 голосов
/ 27 мая 2020

вместо вашего кода используйте это в вашем searchView.

search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    String userInput = newText.toLowerCase();
                    List<Recipes> newList = new ArrayList<>();
                    for (Recipes recipesList : item) {
                      if(recipesList.getmrecipeName.toLowerCase().contains(userInput){
                            newList.add(recipesList);
                        }
                    }
                    adapter.upToDate(newList);
                    return true;
                }
            });

и добавьте этот ниже код в свой адаптер в качестве функции.

    public void upToDate(List<Recipes> newList){
    recipesList = new ArrayList<>(); // recipesList is your arrayList in your adapter that you give it from activity
    recipestList.addAll(newList);
    notifyDataSetChanged();
}
...