for any body has the same case, you can implement Viewpager2 from here
then add adapter.notifyItemChanged(position);
as below:
viewPager = (ViewPager2) android.findViewById(R.id.view_pager);
tabLayout = (TabLayout) android.findViewById(R.id.tab_layout);
ViewPagerAdapter adapter = new ViewPagerAdapter(getFragmentManager(),getLifecycle());
viewPager.setAdapter(adapter);
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
}
@Override
public void onPageSelected(int position){
super.onPageSelected(position);
adapter.notifyItemChanged(position);
}
});
new TabLayoutMediator(tabLayout, viewPager, true,
(tab, position) -> {
switch (position) {
case 0:
tab.setText(getString(R.string.tab1));
break;
case 1:
tab.setText(getString(R.string.tab2));
break;
case 2:
tab.setText(getString(R.string.tab3));
break;
case 3:
tab.setText(getString(R.string.tab4));
break;
default:
tab.setText(getString(R.string.tab1));
break;
}
}).attach();
The above code will refresh the code each time you click the tab. but not when sliding the viewpager.
the code for adapter is:
public class ViewPagerAdapter extends FragmentStateAdapter {
private static final int CARD_ITEM_SIZE = 4;
public ViewPagerAdapter(@NonNull FragmentManager fragmentActivity, @NonNull Lifecycle life) {
super(fragmentActivity,life);
}
@NonNull
@Override
public Fragment createFragment(int position) {
//return CardFragment.newInstance(position);
switch (position) {
case 0:
return FragmentTab1.newInstance();
case 1:
return FragmentTab2.newInstance();
case 2:
return FragmentTab3.newInstance();
case 3:
return FragmentTab4.newInstance();
default:
return FragmentTab1.newInstance();
}
}
@Override
public int getItemCount() {
return CARD_ITEM_SIZE;
}
}