How to handle AsyncTask's in ActionBarActivity Fragments when ViewPager is used?

前端 未结 4 1086
眼角桃花
眼角桃花 2020-11-28 13:11

I\'m using ActionBarActivity to create 5 tabs. I have used ViewPager to swipe between the 5 tabs using SectionsPagerAdapter which extends FragmentPagerAdapter. Each tab has

相关标签:
4条回答
  • 2020-11-28 13:24

    Hi You can try by using tag of each fragment and call method of each fragment on Page Changed

    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                        @Override
                        public void onPageSelected(int position) {
                            actionBar.setSelectedNavigationItem(position);
                            actionBar.setTitle(getHomePageTitle(position));
                            Fragment f = getFragrmentManager().findFragmentByTag(
                                    "" + position);
                            if (f != null)
                                f.refresh();
                        }
                    });
    

    and on

             @Override
            public Fragment getItem(int position) {
              Fragment f=null;
    
            switch (position) 
            {
                case 0:
                    f = new Fragment1(); 
                    break;
    
                case 1:
                     f = new Fragment2(); 
                     break;
    
                case 2:
                     f = new Fragment3();  
                     break;
    
                case 3: 
                    f = new Fragment4();
                    break;
    
    
                case 4: 
                     f = new Fragment5();
                    break;
    
                }
                 f.setTag(""+position);
                return f;
    
            }
    
    0 讨论(0)
  • 2020-11-28 13:32

    ViewPager creates views for fragments adjacent to your current page. This also gives you an opportunity to load any data required for the adjacent fragments. If you are using AsyncTasks to load data, using this feature will result in a better user experience. But if you need an event when a particular page is opened by the viewpager, LordRaydenMK's solution will work.

    See my post on the following thread for using AsyncTasks in a ViewPager:

    AsyncTask runs on each page of the ViewPager

    0 讨论(0)
  • 2020-11-28 13:37

    Use this

    viewPager.setOffscreenPageLimit(1); // the number of pages you want to load in background
    

    and also a ProgressDialogue.

    0 讨论(0)
  • 2020-11-28 13:40

    The FragmentPagerAdapter keeps additional fragments, besides the one shown, in resumed state. The solution is to implement a custom OnPageChangeListener and create a new method for when the fragment is shown.

    1) Create LifecycleManager Interface The interface will have two methods and each ViewPager’s Fragment will implement it. These methods Are as follows:

    public interface FragmentLifecycle {
    
        public void onPauseFragment();
        public void onResumeFragment();
    
    }
    

    2) Let each Fragment implement the interface Add iplements statement for each class declaration:

    public class FragmentBlue extends Fragment implements FragmentLifecycle
    public class FragmentGreen extends Fragment implements FragmentLifecycle
    public class FragmentPink extends Fragment implements FragmentLifecycle
    

    3) Implement interface methods in each fragment In order to check that it really works as expected, I will just log the method call and show Toast:

    @Override
    public void onPauseFragment() {
        Log.i(TAG, "onPauseFragment()");
        Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
    }
    
    @Override
    public void onResumeFragment() {
        Log.i(TAG, "onResumeFragment()");
        Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
    }
    

    4) Call interface methods on ViewPager page change You can set OnPageChangeListener on ViewPager and get callback each time when ViewPager shows another page:

    pager.setOnPageChangeListener(pageChangeListener);
    

    5) Implement OnPageChangeListener to call your custom Lifecycle methods

    Listener knows the new position and can call the interface method on new Fragment with the help of PagerAdapter. I can here call onResumeFragment() for new fragment and onPauseFragment() on the current one.

    I need to store also the current fragment’s position (initially the current position is equal to 0), since I don’t know whether the user scrolled from left to right or from right to left. See what I mean in code:

    private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
    
        int currentPosition = 0;
    
        @Override
        public void onPageSelected(int newPosition) {
    
            FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
            fragmentToShow.onResumeFragment();
    
            FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
            fragmentToHide.onPauseFragment();
    
            currentPosition = newPosition;
        }
    
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) { }
    
        public void onPageScrollStateChanged(int arg0) { }
    };
    

    I didn't write the code. Full tutorial here: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

    0 讨论(0)
提交回复
热议问题