私は次のアプリ構造を持っています:
- Activity (ViewPager tabs)
- Fragment A -> Recyclerview with StaggeredGridLayoutManager
- Fragment B -> Recyclerview with GridLayoutManager
問題: バックグラウンドで数時間保持した後にアプリを開くと、recyclerviewは空白Fragment A
のままですが、recyclerview にはデータが表示されます。両方の recyclerviews は、アダプターで arraylist の同じインスタンスを使用しています。Fragment B
アプリが短時間で最小化/再開された場合、問題は発生しません。
開発者オプションでに設定Background process limit
することでこれを再現できます。No background processes
したがって、OSによってプロセスが停止/強制終了されるたびに、これが発生すると思います。
FragmentStatePagerAdapter
ViewPager のアダプターとして拡張するクラスを使用しています。
すでに次のことを試しましたが、うまくいきません:
https://stackoverflow.com/a/36099641 (AppCompatActivity から getChildFragmentManager を呼び出すことはできません)
- https://stackoverflow.com/a/28262885/6671004
編集 1: FragmentA
で に置き換えるStaggeredGridLayoutManager
とGridLayoutManager
、データが表示されます。したがって、問題はStaggeredGridLayoutManager
編集2:コードの添付(わかりやすいようにクラス/変数名を簡略化)
- TabAdapter - ビューページャーのアダプター
public class TabAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public TabAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
}
- アクティビティ- ビューページャーを含む
public class MyActivity extends AppCompatActivity implements TabLayout.BaseOnTabSelectedListener {
public static List<MyPojo> mylist = new ArrayList<>();
private TabAdapter adapter;
private TabLayout tabLayout;
private ViewPager viewPager;
private FragmentA fragmentA;
private FragmentB fragmentB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_landing);
viewPager = findViewById(R.id.viewPager);
tabLayout = findViewById(R.id.tabLayout);
adapter = new TabAdapter(getSupportFragmentManager());
mylist.add(...) // arraylist populated
fragmentA = new FragmentA();
fragmentB = new FragmentB();
adapter.addFragment(fragmentA, "A");
adapter.addFragment(fragmentB, "B");
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
tabLayout.addOnTabSelectedListener(this);
}
... other methods
}
- フラグメント A - ずらしたグリッド レイアウト
public class FragmentA extends Fragment {
private RecyclerView mRecyclerView;
private FragmentAAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_a, container, false);
mRecyclerView = view.findViewById(R.id.recycler_view_a);
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, 1));
adapter = new FragmentAAdapter(getActivity(), MyActivity.myList);
mRecyclerView.setAdapter(adapter);
return view;
}
public void updateRecyclerViewData(){
if (adapter != null)
adapter.notifyDataSetChanged();
}
... other methods
}
- フラグメント B - グリッド レイアウトあり
public class FragmentB extends Fragment {
private RecyclerView mRecyclerView;
private FragmentBAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_b, container, false);
mRecyclerView = view.findViewById(R.id.recycler_view_b);
mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
adapter = new FragmentBAdapter(getActivity(), MyActivity.myList);
mRecyclerView.setAdapter(adapter);
return view;
}
public void updateRecyclerViewData() {
if (adapter != null)
adapter.notifyDataSetChanged();
}
... other methods
}