在Android应用中遇到的问题?
1.viewpager和它的adapter是如何配合工作的?
声明:本文内容针对android.support.v4.app.*
ViewPager有两个adapter:FragmentPagerAdapter和FragmentStatePagerAdapter:
android.support.v4.app.FragmentPagerAdapter
继承自android.support.v4.view.PagerAdapter,每页都是一个Fragment,并且所有的Fragment实例一直保存在Fragment manager中。所以它适用于少量固定的fragment,比如一组用于分页显示的标签。除了当Fragment不可见时,它的视图层(view hierarchy)有可能被销毁外,每页的Fragment都会被保存在内存中。
android.support.v4.app.FragmentStatePagerAdapter
继承自android.support.v4.view.PagerAdapter,每页都是一个Fragment,当Fragment不被需要时(比如不可见),整个Fragment都会被销毁,除了saved state被保存外(保存下来的bundle用于恢复Fragment实例)。所以它适用于很多页的情况。
FragmentPagerAdapter和FragmentStatePagerAdapter对Fragment的管理略有不同,在详细考察二者区别之前,我们通过两种较为直观的方式先感受下:
FragmentPagerAdapter 继承自 PagerAdapter,该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;
FragmentStatePagerAdapter 继承自 PagerAdapter, 当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。
解决方案:
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter { private List<Fragment> fragments = null; private Context context; public MyFragmentStatePagerAdapter(Context context, FragmentManager fm, List<Fragment> fragments) { super(fm); this.context = context; this.fragments = fragments; notifyDataSetChanged(); } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getItemPosition(Object object) { return PagerAdapter.POSITION_NONE; } @Override public int getCount() { return fragments.size(); } }在获取数据的时候
buyFragments.clear(); for (int i = 0; i < flashSalesListBeen.size(); i++) { buyFragments.add(BuyingFragment.newInstance(flashSalesListBeen.get(i))); } if (titleAdapter == null) { titleAdapter = new MyFragmentStatePagerAdapter(getContext(), getActivity().getSupportFragmentManager(), buyFragments); mViewPager.setAdapter(titleAdapter); } else { titleAdapter.notifyDataSetChanged(); }