Mike Kng
Mike Kng

Reputation: 285

Stop ViewPager from reloading when Activity changed

In my app I have a fragment that contains a ListView. The items of the list are clickable, so a new activity is opened and proceeds with the necessary information from the list item. When I return from that activity to my Fragment it is reloaded, but I would like to not fetch the whole data again and just resume to it. I noticed that there are other questions about how to prevent the reloading when the Fragment is changed, but I didn’t find a working solution about changing to another activity and returning without forcing it to reload. Is there a way prevent it in that case as well? And is it implemented in the MainActivity or the specific Fragment then?

My MainActivity with the ViewPager:

public class MainActivity extends AppCompatActivity {
   
    private ViewPager viewPager;
    public BottomNavigationView bottomNavigationView;
    QuestionsFragment questionsFragment;
    GroupsFragment groupsFragment;
    ProfileFragment profileFragment;
    MenuItem prevMenuItem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        //Initializing viewPager
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        //Initializing the bottomNavigationView
        bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(
                new BottomNavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.navigation_questions:
                                viewPager.setCurrentItem(0);
                                break;
                            case R.id.navigation_groups:
                                viewPager.setCurrentItem(1);
                                break;
                            case R.id.navigation_profile:
                                viewPager.setCurrentItem(2);
                                break;
                        }
                        return false;
                    }
                });

        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int position) {
                if (prevMenuItem != null) {
                    prevMenuItem.setChecked(false);
                }
                else
                {
                    bottomNavigationView.getMenu().getItem(0).setChecked(false);
                }
                Log.d("page", "onPageSelected: "+position);
                bottomNavigationView.getMenu().getItem(position).setChecked(true);
                prevMenuItem = bottomNavigationView.getMenu().getItem(position);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
        setupViewPager(viewPager);
    }
    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        questionsFragment = new QuestionsFragment();
        groupsFragment = new GroupsFragment();
        profileFragment = new ProfileFragment();
        adapter.addFragment(questionsFragment);
        adapter.addFragment(groupsFragment);
        adapter.addFragment(profileFragment);
        viewPager.setAdapter(adapter);
        int limit = adapter.getCount();
        viewPager.setOffscreenPageLimit(limit);
    }
}

The Fragment I‘d like to resume to:

public class QuestionsFragment extends Fragment {
    private RecyclerView recyclerView;
    private RecyclerView.Adapter recyclerViewAdapter;
    private RecyclerView.LayoutManager recyclerViewlayoutManager;
    private List<QuestionModel> questionList;
    public QuestionsFragment() {
       
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_questions, container, false);
        
    //fill questionList
    recyclerViewAdapter = new RecyclerViewQuestionAdapter(questionList, getActivity());
    recyclerView.setLayoutManager(recyclerViewlayoutManager);
    recyclerView.setAdapter(recyclerViewAdapter);
        
    return view;
    }
}

Upvotes: 0

Views: 628

Answers (1)

Avinash Ch
Avinash Ch

Reputation: 86

Hi your ViewPagerAdapter must extends FragmentStatePageAdapter than the FragmentPagerAdapter if not.

FragmentStatePageAdapter holds the fragment states on tab changes and when you come back and forth . The Fragment instance is recreated once you return back to an existing item and the state is restored. This adapter is suitable for lists with an unknown count or for lists where the items change a lot.

setOffscreenPageLimit() to 3 or 2 as u r using 3 fragments as least .

When using FragmentPagerAdapter you must make sure to clear any references to the current View or Context in onDestroyView()

Upvotes: 1

Related Questions