如何从PagedListAdapter刷新RecyclerView中的数据?

时间:2018-11-21 13:20:13

标签: android android-recyclerview android-pageradapter android-paging android-paging-library

使用以下代码行,我可以使用RecyclerViewPagedListAdapter中显示来自后端服务器的数据。

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数据。该如何解决?

5 个答案:

答案 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)

PagedListAdapterandroid.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