【问题标题】:Android Fragment with FirebaseRecyclerAdapter looses scroll position on rotation带有 FirebaseRecyclerAdapter 的 Android 片段在旋转时失去滚动位置
【发布时间】:2017-05-15 20:16:37
【问题描述】:
我正在使用带有 firebaseui 的 FirebaseRecyclerAdapter 的 firebase 数据库。我在这里遵循了这个例子:
https://github.com/firebase/FirebaseUI-Android/tree/master/database
- 除了我使用的是片段。
该应用程序运行良好,我没有任何问题,只是当设备旋转时,回收站视图不会恢复其滚动位置,而是重置为顶部项目。
- 例如,用户向下滚动 8 个项目,然后旋转设备。用户应该在相同的滚动位置,但位置已返回到顶部。
我想我可以添加额外的代码来处理这个问题并滚动到正确的位置,但我从经验中知道RecyclerView 应该自己处理这个问题。 FirebaseRecyclerAdapter 需要我处理这个吗?
【问题讨论】:
标签:
android
firebase
firebase-realtime-database
android-recyclerview
firebaseui
【解决方案1】:
回答我自己的问题-
我能够让它工作的唯一方法是像这样保存状态:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mRvPositionIndex = mLayoutManager.findFirstVisibleItemPosition();
View startView = mRecyclerView.getChildAt(0);
mRvTopView = (startView == null) ? 0 : (startView.getTop() - mRecyclerView.getPaddingTop());
outState.putInt(RV_POS_INDEX, mRvPositionIndex);
outState.putInt(RV_TOP_VIEW, mRvTopView);
}
然后在onCreateView() 中,在我设置适配器后立即执行此操作
if (savedInstanceState != null) {
mRvPositionIndex = savedInstanceState.getInt(RV_POS_INDEX);
mRvTopView = savedInstanceState.getInt(RV_TOP_VIEW);
mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
public void onItemRangeInserted(int positionStart, int itemCount) {
mLayoutManager.scrollToPositionWithOffset(mRvPositionIndex, mRvTopView);
}
});
}
到目前为止,我已经进行了一些测试,但似乎工作正常。如果有人有更好的解决方案,请告诉我。
【解决方案2】:
我还发现即使在正常活动中也能正常工作的解决方案
在 onCreate 中:
mDataObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
mLayoutManager.scrollToPositionWithOffset(mRvPositionIndex, 0);
}
};
myFirebaseRecyclerAdapter.registerAdapterDataObserver(mDataObserver);
别忘了注销 AdapterDataObserver。