【问题标题】: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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多