Не удалось отфильтровать PagedList?

Я реализовал утилиту просмотра с помощью подкачки с помощью библиотеки подкачки Android (https://developer.android.com/topic/libraries/architecture/paging.html). Он отлично работает при извлечении данных и получении последующих страниц. Однако, как отфильтровать PagedList? Скажем, у меня есть виджет поиска, и я хочу найти список в данный момент на экране. PagedList.filter() возвращает List, а PagedListAdapter.setList() не принимает List.

Ответ 1

Я думаю, что вы могли бы решить эту проблему с помощью MediatorLiveData.

В частности, Transformations.switchMap и немного дополнительной магии.

В настоящее время я использую

public void reloadTasks() {
    if(liveResults != null) {
        liveResults.removeObserver(this);
    }
    liveResults = getFilteredResults();
    liveResults.observeForever(this);
}

Но если вы подумаете об этом, вы сможете решить эту проблему, не используя наблюдаем за Forever, особенно если учесть, что switchMap также делает нечто подобное.

Итак, нам нужны LiveData, который подключен к LiveData>, который нам нужен.

private MutableLiveData<String> filterText = new MutableLiveData<>();

private final LiveData<List<T>> data;

public MyViewModel() {
    data = Transformations.switchMap(
            filterText,
            (input) -> { 
                if(input == null || input.equals("")) { 
                    return repository.getData(); 
                } else { 
                    return repository.getFilteredData(input); }
                }
            });
  }

  public LiveData<List<T>> getData() {
      return data;
  }

Таким образом, фактические изменения от одного к другому обрабатываются MediatorLiveData. Если мы хотим кэшировать LiveDatas, мы можем сделать это в анонимном экземпляре, который мы передаем методу.

data = Transformations.switchMap(
        filterText, new Function<String, LiveData<List<T>>>() {
            private Map<String, LiveData<List<T>>> cachedLiveData = new HashMap<>();

            @Override
            public LiveData<List<T>> apply(String input) {
                // ...
            }
        }

Ответ 2

Пожалуйста, попробуйте следующий код, надеюсь, что он поможет найти в загруженном ArrayList из API, я добавил много кода для лучшего понимания.

//Component Casting
SearchView   search_channel = (SearchView) rootView.findViewById(R.id.search_channel);

//Component Interface
search_channel.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String mSearchText) {
                if (mSearchText.length() > 2) {
                    search_channel.clearFocus();
                }
                return true;
            }

            @Override
            public boolean onQueryTextChange(String searchString) {
                    if (mAdapter != null) {
                        mAdapter.getFilter().filter(searchString);
                    }
                return true;
            }
        });



// Filter inside  Adapter class  
    @Override
                public Filter getFilter() {
                    return new Filter() {
                        @Override
                        protected FilterResults performFiltering(CharSequence charSequence) {
                            List<ChannelsData> filteredResult = getFilteredResults(charSequence);

                            FilterResults results = new FilterResults();
                            results.values = filteredResult;
                            results.count = filteredResult.size();
                            return results;
                        }

                        @Override
                        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                            mChannelsList = (ArrayList<ChannelsData>) filterResults.values;
                            mAdapter.notifyDataSetChanged();
                            }

                        private List<ChannelsData> getFilteredResults(CharSequence constraint) {
                            if (constraint.length() == 0) {
                                return mChannelsListTemp;
                            }
                            List<ChannelsData> listResult = new ArrayList<ChannelsData>();
                            for (ChannelsData obj : mChannelsListTemp) {
                                if (obj.getStr_channelName().toLowerCase().trim().contains(constraint.toString().toLowerCase().trim())) {
                                    listResult.add(obj);
                                }
                            }
                            return listResult;
                        }
                    };
                }