I am using BottomNavigationView with 5 tabs. Initially, I load 1st tab once the app starts. When I click on any other tab, an API call is made and data is loaded. Now When I click on the previous tab again (which was loaded on startup) the API call is made to load the same data again.
I do not want to load data again and want to show the fragment with the same data without a fresh API call.
My code:
public class MainActivity extends AppCompatActivity implements NavigationBarView.OnItemSelectedListener {
private BottomNavigationView bottomNavigationView;
public static ViewPager2 viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.viewpager);
bottomNavigationView = findViewById(R.id.navigation);
bottomNavigationView.setOnItemSelectedListener(this);
getTabs();
}
public void getTabs() {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentAdapterMain adapter = new FragmentAdapterMain(fragmentManager, getLifecycle());
viewPager.setAdapter(adapter);
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
switch (position) {
case 0:
bottomNavigationView.getMenu().findItem(R.id.one).setChecked(true);
break;
case 1:
bottomNavigationView.getMenu().findItem(R.id.two).setChecked(true);
break;
case 2:
bottomNavigationView.getMenu().findItem(R.id.three).setChecked(true);
break;
case 3:
bottomNavigationView.getMenu().findItem(R.id.four).setChecked(true);
break;
case 4:
bottomNavigationView.getMenu().findItem(R.id.five).setChecked(true);
break;
}
}
});
}
@SuppressLint("NonConstantResourceId")
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.one:
viewPager.setCurrentItem(0, false);
break;
case R.id.two:
viewPager.setCurrentItem(1, false);
break;
case R.id.three:
viewPager.setCurrentItem(2, false);
break;
case R.id.four:
viewPager.setCurrentItem(3, false);
break;
case R.id.five:
viewPager.setCurrentItem(4, false);
break;
}
return true;
}
}
I do not want to use viewPager.setOffscreenPageLimit(size) because it loads data in all 5 fragments on startup at once (I don't want to call all 5 APIs on startup).