屏幕方向更改后无法恢复RecyclerView状态,因为保存的状态为null.为什么



我有一个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);
}

}

在onViewCreated((中,我在检查null时包含了一些Log消息。似乎recyclerViewStaterecyclerView.getLayoutmanager()都为空,因为它打印"AAAAAAAAA"one_answers"BBBBBBBB"。我不明白为什么。我回答了几个SO问题,做了同样的事情,它应该有效。

为什么recyclerViewStaterecyclerView.getLayoutmanager()都为空
我在这里做错了什么?

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

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

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

当涉及到在处理配置更改时保持活动/片段的状态时,这似乎就足够了。

相关内容

最新更新