fekra
fekra

Reputation: 405

Refresh fragment when change between tabs

App open on first fragment and there is 2 tabs i want to refresh second fragment when i move to it but i don't want to refresh first fragment

MainActivity

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

}
private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new Main_Button(), "Main");
    adapter.addFragment(new TwoFragment(), "Main2");
    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

please explain your answer because i'm new in android and i don't know how i can do that

Upvotes: 16

Views: 37110

Answers (7)

Shaun Gumbaketi
Shaun Gumbaketi

Reputation: 1

you could use ViewPager.addOnPageChangeListener to listen to when the fragments are swiped and incorporate some type of action there.

Upvotes: 0

quarantine85
quarantine85

Reputation: 11

Try this - it works for me

This code reloads current fragment, when it visible to user. Works when swiping and when back button pressed on next fragment.

@Override
    public void setUserVisibleHint(boolean isVisible) {
        super.setUserVisibleHint(isVisible);
        if (isVisible) {
                FragmentTransaction ftr = getFragmentManager().beginTransaction();
                ftr.detach(this).attach(this).commit();
        }
    }

Upvotes: 1

Barungi Stephen
Barungi Stephen

Reputation: 847

As of 2020 it is advisable to use architecture components(MVVM) such as LiveData and viewModel

This way all Fragments can share the same state

see docs here https://developer.android.com/jetpack/guide

Upvotes: 1

Rahul
Rahul

Reputation: 239

Try This

ViewPager mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2); 

Upvotes: 2

megamind
megamind

Reputation: 627

Inside Your fragment class use the below code:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getFragmentManager().beginTransaction().detach(this).attach(this).commit();
    }
}

Upvotes: 33

BMacedo
BMacedo

Reputation: 778

If you wouldn't mind refreshing every fragment every time a tab changes, you could simply override the getItemPosition() method of your FragmentPagerAdapter and make it return always the value POSITION_NONE. Example:

@Override
public int getItemPosition(Object object) {
   return POSITION_NONE;
}

By doing that, you tell android to refresh the fragment each time the view pager tries to get it. Performance wise, it isn't the best practice. So there is a second approach:

First, create an interface to be called when your need refresh:

public interface Updatable {
   public void update();
}

Then, make your fragments implement this interface:

public class MyFragment extends Fragment implements Updateable {

   ...

   @Override
   public void update() {
     // refresh your fragment, if needed
   }
}

If your really wish to not update your first fragment, do nothing in its update() method.

Third, override the getItemPosition method and call update(). This will be called every time a fragment gets selected:

@Override
public int getItemPosition(Object object) {
   Updatable f = (Updatable) object;
   if (f != null) {
      f.update();
   }
  return super.getItemPosition(object);
}

Most of this code came from this answer.

Upvotes: 0

ianhanniballake
ianhanniballake

Reputation: 199805

When a Fragment is made visible (i.e., the selected page in your ViewPager), its setUserVisibleHint() method is called. You can override that method in your TwoFragment and use it to trigger a refresh.

public class TwoFragment extends Fragment {

  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
      // Refresh your fragment here
    }
  }

Upvotes: 48

Related Questions