Мой поиск / фильтр ничего не делает при наборе внутри - PullRequest
0 голосов
/ 21 ноября 2018

Я написал код для приложения, предназначенного для чтения XML и заполнения представления списка прочитанными данными.Данные хранятся в содержащем классе.Я создал класс адаптера, а также пользовательский фильтр.По какой-то причине, когда я печатаю внутри своего searchView, ничего не появляется!Я просмотрел YouTube / Google в течение нескольких дней и не могу ничего найти!пожалуйста, помогите!

private class ArticleAdapter extends ArrayAdapter<Article> implements Filterable {
        private List<Article> completeList = new ArrayList<>(articles);

        public ArticleAdapter(Context ctx) {

            super(ctx, 0);

        }

        @NonNull
        @Override
        public Filter getFilter() {
            return titleFilter;
        }


        public int getCount() {
            return articles.size();
        }

        public Article getItem(int position) {
            return articles.get(position);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = LayoutInflater.from(getContext()).inflate(R.layout.title_layout, parent, false);

            }


            TextView articleTitle = convertView.findViewById(R.id.titleId);

            Article article = getItem(position);
            if (article != null) {
                articleTitle.setText(getItem(position).title);
            }


            return convertView;


        }

        Filter titleFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                List<Article> suggestions = new ArrayList<>();
                if (constraint == null || constraint.length() == 0) {
                    suggestions.addAll(completeList);

                } else {
                    String filterPattern = constraint.toString().toLowerCase().trim();
                    for (Article title : completeList) {
                        if (title.getTitle().toLowerCase().contains(filterPattern)) {
                            suggestions.add(title);
                        }
                    }
                }
                results.values = suggestions;
                results.count = suggestions.size();

                return results;
            }

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

            }

            @Override
            public CharSequence convertResultToString(Object resultValue) {

                return ((Article) resultValue).getTitle();
            }
        };

       /* public long getItemId(int position) {
            return getItem(position).id;
        }
*/

    }


}

И это метод onCreateOptionsMenu из моего класса ArticleList (основной класс)

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_search, menu);
        item = menu.findItem(R.id.menuSearch);
        searchView = (SearchView) item.getActionView();


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

            @Override
            public boolean onQueryTextChange(String newText) {
                if (articles.isEmpty()) {

                }
                adapter.getFilter().filter(newText);

                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

1 Ответ

0 голосов
/ 21 ноября 2018

У меня был список клиентов, где я должен был искать клиента по его имени. Вот код. Надеюсь, это поможет.:)

// Определены два глобальных списка

приватный список customerList = new ArrayList <> ();

приватный список searchCustomerList = new ArrayList <> ();

В onCreate () я вызываю этот метод: addTextListener ();

private void addTextListener () {

    try {

        searchBar.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            public void onTextChanged(CharSequence query, int start, int before, int count) {

                query = query.toString().toLowerCase();
                searchCustomerList.clear();
                for (int i = 0; i < customerList.size(); i++) {
                    if (customerList.get(i) != null) {
                        String text = customerList.get(i).getCustomerName().toLowerCase();
                        if (text.toString().contains(query)) {
                            searchCustomerList.add(customerList.get(i));
                        }
                    }
                }
                Log.d("filterflower", "size: " + searchCustomerList.size());
                customerListAdapter.updateList(searchCustomerList);  // data set changed
            }
        });

    }catch (Exception e){
        e.printStackTrace();
    }
}

// Вот метод updateList в моем адаптере утилизатора

 public void updateList(List<CustomerListDataModel> searchCustomerList) {
      customerList = searchCustomerList;
      notifyDataSetChanged();
    }
...