java - 为什么我的 recyclerView 在 onViewStateRestored 中返回 null?
问题描述
我的应用程序是一个基于主/详细信息流的应用程序,它从 reddit 获取图片,将它们显示在 recyclerView 中,点击后会打开一个详细信息视图,您可以在其中将图片设置为墙纸。我不知道如何让手机轮换正常工作。当手机旋转并使我的应用程序崩溃时,我的 recyclerView 在我的 onViewStateRestored 方法中返回 null。
我浏览了各种教程和示例,以及许多堆栈溢出问题,但找不到具体答案。
这是我正在处理的片段代码:
private DataAdapter adapter;
private RecyclerView recyclerView;
private OnFragmentInteractionListener mListener;
private static final String BUNDLE_RECYCLER_LAYOUT = "ListFragment.recycler.layout";
public View myView;
public ListFragment() {
// Required empty public constructor
}
public static ListFragment newInstance() {
ListFragment fragment = new ListFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
GetDataService service = RetrofitInstance.getRetrofitInstance().create(GetDataService.class);
Call<Article> call = service.getData();
Log.wtf("Url Called", call.request().url() + "");
call.enqueue(new Callback<Article>() {
@Override
public void onResponse(Call<Article> call, Response<Article> response) {
Log.wtf("Response body", response.body().getData().getChildren().toString());
generateDataList(response.body().getData().getChildren());
}
@Override
public void onFailure(Call<Article> call, Throwable t) {
Toast.makeText(getActivity(), "Something went wrong...Please try again later!", Toast.LENGTH_LONG).show();
t.printStackTrace();
}
});
}
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(myView == null) {
myView = inflater.inflate(R.layout.fragment_list, container, false);
}
// Inflate the layout for this fragment
return myView;
}
private void generateDataList(List<Child> dataList) {
recyclerView = (RecyclerView) getView().findViewById(R.id.recycler_view_data_list);
dataList.subList(0, 2).clear();
adapter = new DataAdapter(getActivity(), dataList);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(BUNDLE_RECYCLER_LAYOUT, recyclerView.getLayoutManager().onSaveInstanceState());
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if(savedInstanceState != null) {
Parcelable savedRecyclerInstanceState = savedInstanceState.getParcelable(BUNDLE_RECYCLER_LAYOUT);
recyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerInstanceState);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
这是我旋转手机时得到的堆栈跟踪:
Process: com.botsone.amoleddit, PID: 5097
java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView$LayoutManager.onRestoreInstanceState(android.os.Parcelable)' on a null object reference
at com.botsone.amoleddit.fragment.ListFragment.onViewStateRestored(ListFragment.java:129)
at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:543)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:907)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2656)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2610)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1470)
at android.app.Activity.performStart(Activity.java:7184)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3147)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:7029)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
解决方案
推荐阅读
- python - BigQuery DataLab 的 query_params 格式
- sql - 如何手动将 BLOB 插入 SQLite 数据库
- python - 使用 Slice 和 __setitem__ 方法的冒泡排序
- javafx-8 - 在 Windows 7 中开发的 JavaFx 应用程序在 Windows 10 中无法正确呈现
- javascript - 无法准备好未定义的属性“长度”尝试上传文件
- python-3.x - 如何删除字典中列表中的空字符串?
- python - ValueError: Expected 2D array, got 1D array 相反,在将 1D 数组转换为 2D 后坚持
- c++ - 使用事务的 MongoDB 错误:所有事务操作的总大小必须小于 16793600。实际大小为 16793810:通用服务器错误
- linux - Linux Mint 19.2 上的 Docker 安装不起作用
- javascript - Javascript:显示数组中键的值