使用FirebaseRecyclerAdapter的Android Fragment在旋转时会丢失滚动位置

时间:2017-05-15 20:16:37

标签: android firebase firebase-realtime-database android-recyclerview firebaseui

我正在使用firebaseui FirebaseRecyclerAdapter的firebase数据库。我跟着这个例子:
https://github.com/firebase/FirebaseUI-Android/tree/master/database - 除了我正在使用片段。

该应用程序正常工作,我没有任何问题,除了旋转设备时,回收器视图不会恢复其滚动位置,而是重置为顶部项目。 - 例如,用户向下滚动8个项目然后旋转设备。用户应该处于相同的滚动位置,但是位置已经返回到顶部。

我想我可以添加额外的代码来处理这个并滚动到正确的位置,但我从经验中知道RecyclerView应该自己处理这个问题。 FirebaseRecyclerAdapter要求我处理这件事吗?

2 个答案:

答案 0 :(得分: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);
            }
        });
    }

到目前为止我做了一些测试,但似乎工作正常。如果有人有更好的解决方案,请告诉我。

答案 1 :(得分:0)

我还发现该解决方案即使在正常活动中也能正常工作

在onCreate中:

mDataObserver = new RecyclerView.AdapterDataObserver() {
    @Override
    public void onItemRangeInserted(int positionStart, int itemCount) {
        mLayoutManager.scrollToPositionWithOffset(mRvPositionIndex, 0);
    }
};

myFirebaseRecyclerAdapter.registerAdapterDataObserver(mDataObserver);

不要忘记注销AdapterDataObserver。