1

私は次のアプリ構造を持っています:

- 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によってプロセスが停止/強制終了されるたびに、これが発生すると思います。

FragmentStatePagerAdapterViewPager のアダプターとして拡張するクラスを使用しています。

すでに次のことを試しましたが、うまくいきません:


編集 1: FragmentAで に置き換えるStaggeredGridLayoutManagerGridLayoutManager、データが表示されます。したがって、問題は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
}
4

0 に答える 0