我正在尝试使用本教程https://panavtec.me/retain-restore-recycler-view-scroll-position(我已经在其他项目中成功使用过)在方向更改后恢复片段中RecyclerView的滚动状态。
保存和恢复本身有效,数据存在......但似乎是错误的
我调试了它,并在片段的onSaveInstanceState中保存...
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Parcelable rvState = mRecyclerView.getLayoutManager().onSaveInstanceState();
outState.putParcelable(INSTANCE_STATE_RV_STATE, rvState);
outState.putParcelableArrayList(INSTANCE_STATE_ENTRIES, (ArrayList<? extends Parcelable>) mAdapter.getViewItems());
}
...我调查了rvState,并将其与我在另一个应用程序中获得的状态进行了比较,其中在RecyclerView中保存滚动状态(虽然在活动中......)按预期工作。
我知道调试器中的这些值不会太多帮助,但我可以看到,对于它正在工作的应用程序,我在onCreate中获得了一个savedInstanceState,它显示了一个锚点偏移和一个锚点位置,两者都是!= 0,在调试器中。
当将此状态恢复到RecyclerView时,滚动状态将正确恢复。
在带有片段的app中,布局管理器的保存状态在调试器中显示这些值均为0(无论我滚动多远),不仅在恢复时,而且在保存时已经存在。 所以对我来说,看起来无法正确确定滚动位置(或锚位置,等等)。所以当然在恢复这个状态时它不会滚动到任何地方。
在这两种情况下,我都在使用GridLayoutManager。
有什么明显的我做错了或忘记了吗?我不太确定要发布什么代码,因为它看起来非常简单......
我使用SupportFragmentManger在活动的onCreate中添加片段,但前提是没有保存的实例状态,以便不覆盖存在的片段。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.fl_container, MyFragment.newInstance())
.commit();
}
}
在片段中我将状态保存在onSaveInstanceState中(参见第一个发布的方法)并在onCreateView中恢复它
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_entries, container, false);
mRecyclerView = v.findViewById(R.id.rv_entries);
mProgressBar = v.findViewById(R.id.pb_loading);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getContext(), getSpanCount(), LinearLayoutManager.VERTICAL, false);
mAdapter = new MyAdapter(this);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(mAdapter);
if(savedInstanceState != null) {
mSavedEntries = savedInstanceState.getParcelableArrayList(INSTANCE_STATE_ENTRIES);
mRecyclerViewState = savedInstanceState.getParcelable(INSTANCE_STATE_RV_STATE);
if (mSavedEntries != null) {
mAdapter.setViewItems(mSavedEntries);
}
if(mRecyclerViewState != null) {
layoutManager.onRestoreInstanceState(mRecyclerViewState);
}
}
(...)
return v;
}
任何暗示都会受到赞赏......
修改 由于Cheticamp问:我在我的gradle文件中声明的版本是 recyclerview-v7:26.1.0 ,当我删除所有保存实例状态时,RecyclerView不会恢复它国家自己。我也尝试只留下恢复条目的部分。这也不会改变任何东西。
答案 0 :(得分:0)
我在LinearLayoutManager上遇到了同样的问题,发现那是因为我在使用XML的RecyclerView之前使用过NestedScrollView。