1

RecyclerView使用以下代码行,我可以在using中显示来自后端服务器的数据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);
    }
}

我每次搜索某些东西时,都需要获取新鲜数据。如何解决这个问题?

4

5 回答 5

2

这个问题可以通过调用来解决

movieViewModel.moviePagedList.dataSource.invalidate()

在您的活动/片段中。

于 2019-01-21T09:44:38.373 回答
1

有了这个答案,我将向您展示我是如何过滤Adapter. 不直接回答你的问题,而是给你另一个解决方案。

首先,我在我的 call 中有一个,EditText在我的我ToolBar调用以下:m_app_bar_title_txtActivity

//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给 my 中的以下方法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;
}

我希望这有帮助..

于 2018-11-21T17:19:26.047 回答
0

PagedListAdapter是一个子类,android.support.v7.widget.RecyclerView.Adapter所以调用notifyDataSetChanged()就行了。

于 2018-11-21T14:14:14.787 回答
0

调用 adapter.refresh()

swiperefresh.setOnRefreshListener {
  movieListAdapter.refresh()
  swiperefresh.isRefreshing = false
}

注意 movieListAdapter 应该扩展 PagingDataAdapter

于 2020-11-09T19:20:16.577 回答
0

这是写在DataSource的文档中的

PagedList / DataSource 对是数据集的快照。如果发生更新,例如重新排序、插入、删除或内容更新,则必须创建一对新的 PagedList / DataSource 。DataSource 必须检测到它不能继续加载它的快照(例如,当数据库查询注意到一个表被无效时),并调用 invalidate()。然后将创建一个新的 PagedList / DataSource 对来从数据库查询的新状态加载数据。

我想这就是答案。

于 2020-07-24T15:28:28.673 回答