Android 屏幕方向更改后无法还原RecyclerView状态,因为保存的状态为空。为什么?
我有一个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
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()
)。