Как обновить данные в RecyclerView из PagedListAdapter? - PullRequest
0 голосов
/ 21 ноября 2018

Используя следующие строки кода, я могу отображать данные с внутреннего сервера в 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);
    }
}

Я каждый раз, когда что-то ищу, мне нужно получить данные для флеша.Как это решить?

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

С этим ответом я покажу вам, как я выполнял фильтрацию элементов в моем 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;
}

Надеюсь, это поможет ..

0 голосов
/ 21 января 2019

Эту проблему можно решить, вызвав

movieViewModel.moviePagedList.dataSource.invalidate()

в вашей активности / фрагменте.

0 голосов
/ 21 ноября 2018

PagedListAdapter является подклассом android.support.v7.widget.RecyclerView.Adapter, поэтому будет делать вызов notifyDataSetChanged().

...