简体   繁体   中英

Fragment not getting refresh on swipe

I am using a viewPager for its swipe abilities to swipe between two Fragments. However I want to refresh the Fragment contents on swipe. The FragmentStatePagerAdapter does a very good job of caching so its hard to get the Fragment to reload. I've tried putting everything in the onResume method but that has no effect.

Here is my code

slideadapter=new ScreenSlidePagerAdapter(this.getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.viewpager);
    mViewPager.setOffscreenPageLimit(1);

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {
            //Not used
            Log.v("TAG","onPageScrolled");
        }

        @Override
        public void onPageSelected(int position) {
            //Force the fragment to reload its data
            Fragment f = slideadapter.getItem(position);
            f.onResume();
        }

        @Override
        public void onPageScrollStateChanged(int i) {
            //Not used
            Log.v("TAG","onPageScrollStateChanged");
        }
    });
    mSlidingTabLayout = (SlidingTabLayout)findViewById(R.id.sliding_tabs);
    mViewPager.setAdapter(slideadapter);

    mViewPager.setCurrentItem(0);

    mSlidingTabLayout.setViewPager(mViewPager);

you can override setUserVisibleHint method in your Fragments

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            doSomething();
        }
    }

Use the ViewPager.onPageChangeListener:

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
 public void onPageScrollStateChanged(int state) {}
 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

 public void onPageSelected(int position) {
    // get fragment by position and do whatever you want to do on fragment selection.
 }
});

you can try mViewPager.setOffscreenPageLimit(1); if you want to call the onresume method everytime the fragments becomes visible

Create a BaseFragment class with a method ex. loadData (),where Viewpager child fragments extends from this BaseFragment and override the loadData () method and do the operation.

viewPager.setOnPageChangeListener(new OnPageChangeListener() {
 public void onPageScrollStateChanged(int state) {}
 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

 public void onPageSelected(int position) {
    if (slideadapter.getFragment(position) instanceof BaseFragment) {
        ((BaseFragment) slideadapter.getFragment (position)).loadData ();
    }
 }
});

In the SlideAdapter create method called

public Fragment getFragment(int key) {
        return mPageReferences.get(key);
    }
private final SparseArray<Fragment> mPageReferences = new SparseArray<Fragment>();

//add created fragment refernce to this array

  @Override
        public Fragment getItem(int position) {
        mPageReferences.put(position, fragment);
    }

//remove the reference when destroy

@Override
    public void destroyItem(ViewGroup container, int position, Object object) {

        mPageReferences.remove(position);
}

Hope this will help!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM