Android 屏幕方向更改后无法还原RecyclerView状态,因为保存的状态为空。为什么?

Android 屏幕方向更改后无法还原RecyclerView状态,因为保存的状态为空。为什么?,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,我有一个Recyclerview,在片段中包含一些数据。如果更改屏幕方向,我希望保存状态并在屏幕方向更改时重新加载 这是我的片段类: public class DataUsageFragment extends Fragment { private static final String TAG = "DataUsage"; private static final boolean debug = true; private RecyclerView recyclerView; private

我有一个Recyclerview,在片段中包含一些数据。如果更改屏幕方向,我希望保存状态并在屏幕方向更改时重新加载

这是我的片段类:

public class DataUsageFragment extends Fragment {
private static final String TAG = "DataUsage";
private static final boolean debug = true;
private RecyclerView recyclerView;
private Parcelable recyclerViewState;
private DataUsageManager dataUsageManager;
private RecyclerView.LayoutManager layoutManager;

public DataUsageFragment() {
}

public static DataUsageFragment getInstance(String title) {
    Log.d(TAG, "getInstance: called");
    DataUsageFragment fragment = new DataUsageFragment();
    Bundle args = new Bundle();
    args.putString("title", title);
    fragment.setArguments(args);
    return fragment;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (debug) Log.d(TAG, "onCreateView is called");
    return inflater.inflate(R.layout.fragment_data_usage, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (debug) Log.d(TAG, "onViewCreated is called");

    if (getArguments() != null) {
        String title = getArguments().getString("title");
        ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(title);
    }

    Context context = view.getContext();
    dataUsageManager = new DataUsageManager(getActivity(), 0);

    // RecyclerView
    recyclerView = view.findViewById(R.id.recycler_view_data);
    if (savedInstanceState == null) {
        Log.d(TAG, "onViewCreated: savedInstanceState in onViewCreated IS NULL!");
        layoutManager = new LinearLayoutManager(context);
        recyclerView.setLayoutManager(layoutManager);
    } else {
        if (recyclerViewState == null)
            Log.d(TAG, "onViewCreated: AAAAAAAAA");
        if (recyclerView.getLayoutManager() == null)
            Log.d(TAG, "onViewCreated: BBBBBBBBB");
        recyclerViewState = savedInstanceState.getParcelable("ListState");
        recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);
    }

    // Data Usage
    // int spinnerItemPos = spinner.getSelectedItemPosition();

    if (savedInstanceState == null) {
        Log.d(TAG, "onViewCreated: NULLNULLNULL");
        // if current API Level < 23 (Marshmallow), use TrafficStats, else NetworkStatsManager
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            dataUsageManager.useTrafficStats();
        } else {
            dataUsageManager.useNetworkStatsManager();
        }
    } else {
        Log.d(TAG, "onViewCreated: QQQQQQQQ");
    }

}

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.d(TAG, "onSaveInstanceState: called");
    recyclerViewState = recyclerView.getLayoutManager().onSaveInstanceState();
    outState.putParcelable("ListState", recyclerViewState);
}
公共类DataUsageFragment扩展了片段{
私有静态最终字符串标记=“DataUsage”;
私有静态最终布尔调试=true;
私人回收站;
私人包裹回收服务;
专用数据使用管理器数据使用管理器;
private RecyclerView.LayoutManager LayoutManager;
公共DataUsageFragment(){
}
公共静态DataUsageFragment getInstance(字符串标题){
d(标记“getInstance:called”);
DataUsageFragment=新的DataUsageFragment();
Bundle args=新Bundle();
args.putString(“title”,title);
fragment.setArguments(args);
返回片段;
}
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
if(debug)Log.d(标记“调用onCreateView”);
返回充气机。充气(R.layout.fragment\u data\u用法,容器,错误);
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
if(debug)Log.d(调用标记“onViewCreated”);
如果(getArguments()!=null){
字符串title=getArguments().getString(“title”);
((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(标题);
}
Context=view.getContext();
dataUsageManager=新的dataUsageManager(getActivity(),0);
//回收视图
recyclerView=view.findViewById(R.id.recycler\u view\u data);
如果(savedInstanceState==null){
d(标记“onViewCreated:onViewCreated中的savedInstanceState为NULL!”);
layoutManager=新的LinearLayoutManager(上下文);
recyclerView.setLayoutManager(layoutManager);
}否则{
如果(RecycleServiceState==null)
Log.d(标记“onViewCreated:aaaaaaaaaaaa”);
if(recyclerView.getLayoutManager()==null)
Log.d(标记“onViewCreated:bbb”);
recyclerViewState=savedInstanceState.getParcelable(“ListState”);
RecycleView.getLayoutManager().onRestoreInstanceState(RecycleViewState);
}
//数据使用
//int spinnerItemPos=spinner.getSelectedItemPosition();
如果(savedInstanceState==null){
d(标记“onViewCreated:nullnull”);
//如果当前API级别<23(棉花糖),请使用TrafficStats,否则使用NetworkStatsManager
if(Build.VERSION.SDK_INT
}

在onViewCreated()中,我在检查null时包含了一些日志消息。 似乎
RecycleViewState
RecycleView.getLayoutmanager()
都是空的,因为它打印“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。我不明白为什么。我问了几个这样的问题,做了同样的事情,它应该是有效的

为什么
recyclerViewState
recyclerView.getLayoutmanager()
都是空的?

我做错了什么?

对于将来遇到类似问题的人

我通过在Android清单文件中添加以下内容解决了这个问题:

<application
        <activity
            ...
            android:configChanges="orientation|screenSize">
            ...
        </activity>
</application>

RecyclerView
会自动执行此操作。您想做什么?@ianhanniballake我想在更改屏幕方向时保留RecyclerView及其所有数据,而无需再次获取数据(此处:无需再次调用,例如
dataUsageManager.useNetworkStatsManager()
)。