如何在屏幕旋转时保持 recyclerView 的滚动位置

Har*_*dra 3 android gridlayoutmanager android-recyclerview

我正在用 gridlayoutManager 填充 recyclerView。现在我想在屏幕旋转上保存滚动位置。

我尝试使用 onSaveInstanceState 和 onRestoreInstanceState() 这样做,如本文所示:

如何使用 RecyclerView.State 保存 RecyclerView 的滚动位置?

下面是我的代码:

@Override
protected void onSaveInstanceState(Bundle outState) {
    Log.e(TAG, "onSaveInstanceState");
    super.onSaveInstanceState(outState);
    outState.putParcelable(KEY_INSTANCE_STATE_RV_POSITION, 
    gridLayoutManager.onSaveInstanceState());
 }


@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {

    Log.e(TAG, "onRestoreInstanceState");
    super.onRestoreInstanceState(savedInstanceState);
    if (savedInstanceState!= null){
        Parcelable savedState = 
    savedInstanceState.getParcelable(KEY_INSTANCE_STATE_RV_POSITION);

        movieAdapter.addAll(movieItemList);
        if (savedState!= null){
            gridLayoutManager.onRestoreInstanceState(savedState);
        }
    }
}


//this is my movieAdapter.addAll() method 

public void addAll(List<MovieItem>items){

    movieItems = items;
}


//This is the method to get lists of movies from ViewModel Class

private void loadFavMovies() {
    FavViewModel favViewModel = 
    ViewModelProviders.of(MainActivity.this).get(FavViewModel.class);
    favViewModel.getFavListLiveData().observe(MainActivity.this, new 
    Observer<List<FavlistItem>>() {
        @Override
        public void onChanged(List<FavlistItem> favlistItems) {
            if (!favlistItems.isEmpty()) {
                loadingIndicator.setVisibility(View.GONE);
                movieRecycler.setVisibility(View.GONE);
                favRecycler.setVisibility(View.VISIBLE);
                favAdapter.setFavlistItems(favlistItems);
                Toast.makeText(getApplicationContext(), "Swipe Left Or 
       Right To remove Item",Toast.LENGTH_SHORT).show();
               }else {
                loadingIndicator.setVisibility(View.GONE);
                Toast.makeText(getApplicationContext(), "No Favorite 
      Movies",Toast.LENGTH_SHORT).show();
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这是该项目的 GitHub 链接https://github.com/harshabhadra/Movies-Mela

小智 8

我知道我迟到了,但如果有帮助的话仍然!!

存储回收器视图位置比其他答案使它看起来简单得多

您可以这样做

首先创建一个成员变量

    Parcelable state;
Run Code Online (Sandbox Code Playgroud)

现在,

@Override
protected void onPause() {
    super.onPause();
    state = recyclerView.getLayoutManager().onSaveInstanceState();
}

@Override
protected void onResume() {
    super.onResume();
        recyclerView.getLayoutManager().onRestoreInstanceState(state);
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码覆盖暂停和恢复方法,你就可以开始了!


gow*_*672 6

现在,它有简单的解决方案。使用此依赖项

    implementation "androidx.recyclerview:recyclerview:1.2.0-alpha05"
Run Code Online (Sandbox Code Playgroud)

然后像下面一样设置 stateRestorationPolicy

myAdapter.stateRestorationPolicy=RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY
Run Code Online (Sandbox Code Playgroud)

  • 这个“stateRestorationPolicy”有效吗?因为我确实实现了它,但是当我的视图重新创建时,recyclerview 没有滚动回其原始位置 (2认同)

Har*_*dra 0

我已经尝试了每个人建议的所有内容,但最后,这个要点对我有用

https://gist.github.com/FrantisekGazo/a9cc4e18cee42199a287

我只需将其导入到我的项目中,并将默认提供的 recyclerView 替换为“StateFulRecyclerView”,它解决了我的问题,并在屏幕旋转或任何配置更改期间自动处理滚动位置。无需使用 onSaveInstanceState 来维护滚动位置。