I have the following app structure :
- Activity (ViewPager tabs)
- Fragment A -> Recyclerview with StaggeredGridLayoutManager
- Fragment B -> Recyclerview with GridLayoutManager
The issue : After opening app after keeping it in background for a couple of hours, the recyclerview in Fragment A
remains blank but the recyclerview in Fragment B
shows data. Both the recyclerviews are using the same instance of arraylist in their adapters.
Issue doesn't occur app is when minimised/resumed in short period of time.
I am able to reproduce this by setting Background process limit
to No background processes
in developer options. So my guess is this happens each time the process is stopped/killed by the OS.
I am using a class that extends FragmentStatePagerAdapter
as adapter for my ViewPager.
Have already tried out the following, but no luck :
https://stackoverflow.com/a/36099641 (can't call getChildFragmentManager from AppCompatActivity)
- https://stackoverflow.com/a/28262885/6671004
Edit 1: In Fragment A
if I replace StaggeredGridLayoutManager
by GridLayoutManager
, it shows data. So the problem seems to be with the StaggeredGridLayoutManager
Edit 2: Attaching code (Simplified class/variable names for easy understanding)
- TabAdapter - adapter for viewpager
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();
}
}
- Activity - which contains the viewpager
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
}
- Fragment A - with Staggered Grid Layout
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
}
- Fragment B - with Grid Layout
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
}