Как обновить данные в RecyclerView из PagedListAdapter?
Используя следующие строки кода, я могу отобразить данные с внутреннего сервера в RecyclerView
с помощью PagedListAdapter
,
movieViewModel = ViewModelProviders.of(this).get(MovieViewModel.class);
MovieAdapter adapter = new MovieAdapter(this);
movieViewModel.moviePagedList.observe(this, adapter::submitList);
recyclerView.setAdapter(adapter);
Я создал этот метод:
private void movieSearch(String searchText) {
globalSearch = searchText;
movieViewModel.replaceSubscription(this);
movieViewModel = ViewModelProviders.of(this).get(MovieViewModel.class);
MovieAdapter adapter = new MovieAdapter(this);
movieViewModel.moviePagedList.observe(this, adapter::submitList);
recyclerView.setAdapter(adapter);
}
Который называется изнутри onQueryTextChange()
отображать результаты поиска, но по некоторым причинам данные в моем RecyclerView
не обновляется.
Это тоже мой MovieViewModel
учебный класс:
public class MovieViewModel extends ViewModel {
LiveData<PagedList<ApiResponse.Movie>> moviePagedList;
public MovieViewModel() {
MovieDataSourceFactory movieDataSourceFactory = new MovieDataSourceFactory(search);
PagedList.Config config = new PagedList.Config.Builder().setEnablePlaceholders(false).setPageSize(20).build();
moviePagedList = new LivePagedListBuilder<>(movieDataSourceFactory, config).build();
}
void replaceSubscription(LifecycleOwner lifecycleOwner) {
moviePagedList.removeObservers(lifecycleOwner);
}
}
Я каждый раз, когда что-то ищу, мне нужно получить данные для флеша. Как это решить?
2 ответа
Эту проблему можно решить, позвонив
movieViewModel.moviePagedList.dataSource.invalidate()
в вашей деятельности / фрагмент.
С этим ответом я покажу вам, как я сделал фильтрацию элементов в моем Adapter
, Не отвечая на ваш вопрос напрямую, а давая вам другое решение.
Во-первых, у меня есть EditText
в моем ToolBar
называется m_app_bar_title_txt
, В моем Activity
Я называю следующее:
//I'm using TextWatcher to see when text changes
m_app_bar_title_txt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
//If the text changes I call the following method
//Passing the text to the metod
filter(s.toString());
}
});
private void filter(String s) {
ArrayList<ScoresData> aData = new ArrayList<>();
for (ScoresData mData : data){
if (mData.textPlayerName.toLowerCase().contains(s.toLowerCase())){
aData.add(mData);
}
}
//this method is in my RecyclerView.Adapter class
//I will provide this below
mAdapter.filterList(aData);
}
mAdapter.filterList(aData);
проходит отфильтрованный ArrayList
к следующему методу внутри моего RecyclerView.Adapter
:
public void filterList(ArrayList<ScoresData> filteredList){
//Changing the original ArrayList -> data to filteredList
//Then notifying that the list has changed
data = filteredList;
notifyDataSetChanged();
}
Если вам интересно, что ScoresData
похоже....
public class ScoresData {
public String mImage;
public String textPlayerName;
public String textPos;
public String textTotalScore;
public String textPlayed;
public String textRounds;
}
Надеюсь, это поможет..
Об этом написано в документации DataSource
Пара PagedList / DataSource - это снимок набора данных. Новая пара PagedList / DataSource должна быть создана, если происходит обновление, такое как изменение порядка, вставка, удаление или обновление содержимого. Источник данных должен определить, что он не может продолжить загрузку своего моментального снимка (например, когда запрос базы данных замечает, что таблица становится недействительной), и вызвать invalidate(). Затем будет создана новая пара PagedList / DataSource для загрузки данных из нового состояния запроса к базе данных.
Думаю, это ответ.
PagedListAdapter
это подкласс android.support.v7.widget.RecyclerView.Adapter
так что призыв к notifyDataSetChanged()
Сделаю.
Вызовите adapter.refresh()
swiperefresh.setOnRefreshListener {
movieListAdapter.refresh()
swiperefresh.isRefreshing = false
}
обратите внимание, что movieListAdapter должен расширять PagingDataAdapter