Android - Recyclerview blank when reopening app after keeping it in background for long

369 Views Asked by At

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 :


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
}
0

There are 0 best solutions below