Фильтр адаптера просмотра списка Android для объекта arrayList - PullRequest
0 голосов
/ 11 марта 2019

У меня есть listView с пользовательским адаптером. Это прекрасно работает, но теперь я попытался добавить собственный фильтр к нему. Логика фильтра работает отлично, и я вижу в журнале, что фильтр находит правильные объекты. Но по некоторым причинам это не обновляет представление. Это мой код:

ListView:

                    Collections.sort(events);
                    Log.d("2", events.toString());
                    final EventsLayoutAdapter mAdapter = new EventsLayoutAdapter(getApplicationContext(), events);
                    lvEvents.setAdapter(mAdapter);
                    svEvent.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                        @Override
                        public boolean onQueryTextSubmit(String query) {

                            mAdapter.getFilter().filter(query);
                            lvEvents.setAdapter(mAdapter);


                            return false;
                        }

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

Это функции фильтра адаптера, которых нет в getView и конструкторах:

public class EventsLayoutAdapter extends ArrayAdapter<ServerEvent> implements Filterable {

    private ArrayList<ServerEvent> dataSet;
    Context mContext;
    LocalFilter mFilter;

    @Override
    public Filter getFilter() {

        if (mFilter == null)
            mFilter = new LocalFilter();

        return mFilter;
    }

    private class LocalFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            Log.d("2","Filter logic began");
            // We implement here the filter logic
            if (constraint == null || constraint.length() == 0) {
                // No filter implemented we return all the list
                results.values = dataSet;
                results.count = dataSet.size();
                Log.d("2","Filter logic no filter: "+ dataSet.size());
            } else {
                // We perform filtering operation
                Log.d("2","Filter logic  filter operation : "+ dataSet.size());

                List<ServerEvent> nArrayList = new ArrayList<ServerEvent>();
                for (ServerEvent item : dataSet) {
                    if(item.getTitle().toUpperCase().contains(constraint.toString().toUpperCase())||
                            item.getPlaceName().toUpperCase().contains(constraint.toString().toUpperCase())||
                            (item.isPriority()?"Important Event":"Regular Event").toUpperCase().contains(constraint.toString().toUpperCase())||
                            BroardFunctions.unixToDate(item.getUnixTime()).contains(constraint.toString())){
                        nArrayList.add(item);
                        Log.d("2",nArrayList.toString());

                    }
                }

                results.values = nArrayList;
                results.count = nArrayList.size();
            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {
            // Now we have to inform the adapter about the new list filtered
            dataSet = (ArrayList<ServerEvent>) results.values;
            notifyDataSetChanged();

        }


    }

}

Возвращает результаты после фильтрации, но список не обновляется в конце.

...