Recyclerview DiffUtil 在更新时将我的列表滚动到顶部

jli*_*ely 5 java android android-recyclerview

我决定DiffUtil尝试一下,而不是notifyDataSetChanged在我的EndlessRecyclerView.

问题是,在第一次或第二次投掷后,我list被滚动到顶部,但项目被添加到列表中。

这是我的DiffUtil

    public class MovieDiffCallback extends DiffUtil.Callback {

    List<Movie> mOldMovieList;
    List<Movie> mNewMovieList;

    public MovieDiffCallback(List<Movie> oldMovieList, List<Movie> newMovieList) {
        this.mOldMovieList = oldMovieList;
        this.mNewMovieList = newMovieList;
    }

    @Override
    public int getOldListSize() {
        return mOldMovieList != null ? mOldMovieList.size() : 0;
    }

    @Override
    public int getNewListSize() {
        return mNewMovieList != null ? mNewMovieList.size() : 0;
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return mOldMovieList.get(oldItemPosition).getId().equals(mNewMovieList.get(newItemPosition).getId());
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return mOldMovieList.get(oldItemPosition).equals(mNewMovieList.get(newItemPosition));
    }

    @Nullable
    @Override
    public Object getChangePayload(int oldItemPosition, int newItemPosition) {
        return super.getChangePayload(oldItemPosition, newItemPosition);
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我在我的Fragment

@Override
public void getMovies(List<Movie> moviesList) {
    mDiffCallback = new MovieDiffCallback(mMoviesList, moviesList);
    mDiffResult = DiffUtil.calculateDiff(mDiffCallback);
    mMoviesList.addAll(moviesList);
    mDiffResult.dispatchUpdatesTo(mAdapter);
    isLoadedLandscape = true;
}
Run Code Online (Sandbox Code Playgroud)

这是在EndlessRecyclerScroll

            @Override
            public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
                scrollPage++;
                populateMap(scrollPage);
                mPresenter.getSuggestedMovies(searchParamsMap);
            }
Run Code Online (Sandbox Code Playgroud)