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