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)
使用上面的代码覆盖暂停和恢复方法,你就可以开始了!
现在,它有简单的解决方案。使用此依赖项
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)
我已经尝试了每个人建议的所有内容,但最后,这个要点对我有用
https://gist.github.com/FrantisekGazo/a9cc4e18cee42199a287
我只需将其导入到我的项目中,并将默认提供的 recyclerView 替换为“StateFulRecyclerView”,它解决了我的问题,并在屏幕旋转或任何配置更改期间自动处理滚动位置。无需使用 onSaveInstanceState 来维护滚动位置。