【问题标题】:Recyclerview in fragment not loading after screen rotate屏幕旋转后片段中的 Recyclerview 未加载
【发布时间】:2018-05-18 10:45:22
【问题描述】:

我想用回收器视图保存我的片段,以便在屏幕旋转时恢复它。我在网上寻找说明,我得到:

在我的片段中

private Parcelable recyclerViewState;

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            list.getLayoutManager().onRestoreInstanceState(recyclerViewState);
        }
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        recyclerViewState = layoutManager.onSaveInstanceState();
    }

在我的活动中

//onCreate
if (savedInstanceState != null) {
            getSupportFragmentManager().getFragment(savedInstanceState, LIST_USERS_FRAGMENT);
        }

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        getSupportFragmentManager().getFragment(outState, LIST_USERS_FRAGMENT);
    }

我正在调试,它看起来不错,但是当我旋转屏幕时,我得到空白片段,没有回收器视图。你能帮我调查一下为什么会这样吗?

【问题讨论】:

    标签: android android-recyclerview orientation screen-rotation


    【解决方案1】:

    Android 中的默认行为是在配置更改时销毁所有附加的片段。要绕过片段重新创建,您应该在片段的 OnCreate 回调中使用 setRetainInstance(true)。

    【讨论】:

      【解决方案2】:

      有不同的选项来处理方向变化:

      1. 锁定屏幕方向

        <activity
         android:name="com.example.test.activity.MainActivity"
         android:screenOrientation="portrait"/>
        
      2. 阻止 Activity 重新创建

        <activity
         android:name="com.example.test.activity.MainActivity"
         android:configChanges="orientation|screenSize|keyboardHidden"/>
        
      3. 保存基本状态

         public class MainActivity extends Activity{
        
         private static final String SELECTED_ITEM_POSITION = "ItemPosition";
         private int mPosition;
        
            @Override
             protected void onSaveInstanceState(final Bundle outState) {
                 super.onSaveInstanceState(outState);
        
                 // Save the state of item position
                  outState.putInt(SELECTED_ITEM_POSITION, mPosition);   
             }
        
             @Override
             protected void onRestoreInstanceState(final Bundle savedInstanceState) {
                 super.onRestoreInstanceState(savedInstanceState);
        
                 // Read the state of item position
                 mPosition = savedInstanceState.gettInt(SELECTED_ITEM_POSITION);
             }
        }
        
      4. 保存复杂对象

      覆盖

        onRetainNonConfigurationInstance()
      
        getLastNonConfigurationInstance()
      

      在 API 级别 13 之后,这些方法已被弃用,取而代之的是更多 Fragment 的 setRetainInstance(boolean) 功能,它提供了在配置更改期间保留对象的更简洁和模块化的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-04
        • 2014-04-29
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多