使用以下代码行,我可以使用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);
}
}
我每次搜索东西时,都需要获取freash数据。该如何解决?
答案 0 :(得分:1)
通过这个答案,我将向您展示如何过滤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;
}
我希望这会有所帮助。
答案 1 :(得分:1)
可以通过致电解决此问题
movieViewModel.moviePagedList.dataSource.invalidate()
您的活动/片段中的
。答案 2 :(得分:0)
PagedListAdapter
是android.support.v7.widget.RecyclerView.Adapter
的子类,因此可以调用notifyDataSetChanged()
。
答案 3 :(得分:0)
这写在DataSource
的文档中一个PagedList / DataSource对是数据集的快照。 如果发生更新(例如重新排序,插入,删除或内容更新),则必须创建一对新的PagedList / DataSource对。数据源必须检测到它无法继续加载其快照(例如,当数据库查询发现表无效时),然后调用invalidate()。然后将创建新的PagedList /数据源对,以从数据库查询的新状态加载数据。
我认为这就是答案。
答案 4 :(得分:0)
致电adapter.refresh()
swiperefresh.setOnRefreshListener {
movieListAdapter.refresh()
swiperefresh.isRefreshing = false
}
请注意movieListAdapter应该扩展PagingDataAdapter