【问题标题】:How to save state of recyclerview in fragment in viewpager?如何在viewpager的片段中保存recyclerview的状态?
【发布时间】:2019-08-15 00:00:15
【问题描述】:

我设置了一个 ViewPager 和 TabLayout,它有 3 个片段,其中一个有一个 RecyclerView。我想在片段被销毁后恢复 RecyclerView 的内容。 RecyclerView 由我使用 AsyncTaskLoader 在 onViewCreated 中调用的 API 填充。我希望它在旋转时保留数据而不重新使用 API。

这就是我正在尝试的方式:

    @Override
public void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    mListState = mLayoutManager.onSaveInstanceState();
    outState.putParcelable(LIST_KEY,mListState);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mLayoutManager = new LinearLayoutManager(mContext);
    mRecyclerView = view.findViewById(R.id.recyclerView_earthquake);
    mAdapter = new EarthquakeAdapter(getContext(), mList);
    mRecyclerView.setAdapter(mAdapter);
    if (savedInstanceState != null){
        mListState = savedInstanceState.getParcelable(LIST_KEY);
        mLayoutManager.onRestoreInstanceState(mListState);
    } else {
        Bundle queryBundle = new Bundle();
        format = DateFormat.getDateInstance(DateFormat.SHORT);
        String startDate = format.format(new Date(System.currentTimeMillis()));
        String endDate = format.format(new Date(System.currentTimeMillis() + 86400000L));
        queryBundle.putString("startDate", startDate);
        queryBundle.putString("endDate", endDate);
        LoaderManager.getInstance(this).restartLoader(0, queryBundle, this);
    }
    mRecyclerView.setLayoutManager(mLayoutManager);
}

这不起作用,当我旋转设备时,RecyclerView 是空的。 我也在使用 FragmentStatePagerAdapter,如果这很重要的话。

【问题讨论】:

  • 在 Manifest.xml 中的活动中添加:android:configChanges="orientation|screenSize" 它会告诉系统在旋转设备时不要破坏和重新创建活动

标签: java android android-fragments android-recyclerview android-viewpager


【解决方案1】:

只需设置适配器中的项目

override fun onSaveInstanceState(outState: Bundle) {
    outState.putParcelableArrayList(ITEMS_KEY, mItems)
}

在 onViewCreated 方法中

if (savedInstanceState?.containsKey(ITEMS_KEY) == true) {
       mAdapter.setItems(savedInstanceState.getParcelableArrayList<YourModel>(ITEMS_KEY))
} else {
       // load data
}

【讨论】:

  • 这很好用。我还必须在我的自定义对象中实现 Parcelable。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
相关资源
最近更新 更多