PagerSlidingTabStrip关联viewpager时,viewpager上fragment切换时保持数据状态,以及viewpager默认缓存的去除

一:布局文件为:

<com.ddhealer.nidmall.view.PagerSlidingTabStrip
    android:layout_marginLeft="13dp"
    android:layout_marginRight="13dp"
    android:id="@+id/pagerSlidingTabStrip"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    tab:pstsIndicatorHeight="2dp"
    tab:pstsUnderlineHeight="0dp"
    tab:pstsIndicatorColor="@color/title_bar"
    tab:pstsTextSize="16sp"
    tab:pstsTextColor="@color/found_tab_font_color"
    tab:pstsDividerColor="@android:color/transparent"
    tab:pstsUnderlineColor="@color/gray_ground"
    tab:pstsShouldExpand="true"
    />

<com.ddhealer.nidmall.view.viewpager.LazyViewPager
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/viewpager"></com.ddhealer.nidmall.view.viewpager.LazyViewPager>

二:activity中进行相应的配置

pagerSlidingTabStrip = (PagerSlidingTabStrip) findViewById(R.id.pagerSlidingTabStrip);
viewpager = (LazyViewPager)findViewById(R.id.viewpager);
categoryLeftMenuAdapter = new CategoryLeftMenuAdapter(mContext,getSupportFragmentManager(),titleAl,titleID,fragments);
viewpager.setAdapter(categoryLeftMenuAdapter);
pagerSlidingTabStrip.setViewPager(viewpager);
//如果需要让activity一进来,就选中某一项,那么就使用viewpager来setCurrentItem,要注意,一定要在setAdapter后面,否则无效哦
viewpager.setCurrentItem(Integer.parseInt(child_sort_id));
ViewPager.OnPageChangeListener listener = new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                selectedPage = position;
                System.out.println("--res--urlpath--onPageSelected--"+position);
                //如果这里不写,那么有可能会造成viewpager上的fragment没有数据
                CategoryLeftMenuFragment pagerFragment = (CategoryLeftMenuFragment)viewpager.getAdapter().instantiateItem(viewpager, selectedPage);

                pagerFragment.cat_id = titleID.get(selectedPage);
//              
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        };
        pagerSlidingTabStrip.setOnPageChangeListener(listener);
三:下面主要介绍上面的viewpager的适配器 CategoryLeftMenuAdapter,正是这个关键部分来实现的viewpager上fragment数据切换时的保存状态

public class CategoryLeftMenuAdapter extends FragmentStatePagerAdapter/*FragmentPagerAdapter*/
{
    ArrayList<String> titleAl;
    ArrayList<String> titleID;
    ArrayList<CategoryLeftMenuFragment> fragments;
    Activity mActivity;
    public FragmentManager fm;
    public CategoryLeftMenuAdapter(Activity mActivity,FragmentManager fm,ArrayList<String> titleAl,ArrayList<String> titleID,ArrayList<CategoryLeftMenuFragment> fragments) {
        super(fm);
        this.fm = fm;
        this.titleAl = titleAl;
        this.fragments = fragments;
        this.titleID = titleID;
        this.mActivity = mActivity;
    }

    @Override
    public Fragment getItem(int position) {
        //新建一个Fragment来展示ViewPager item的内容,并传递参数
        CategoryLeftMenuFragment fragment = /*new CategoryLeftMenuFragment()*/fragments.get(position);
        Bundle args = new Bundle();
        args.putInt("position", position);
        args.putString("cat_id", titleID.get(position));
        SharedPreferencesUtil.saveStringData(mActivity,"cat_id",titleID.get(position));
        System.out.println("--res--urlpath--适配器getItem方法--所传cat_id为:" + titleID.get(position));
        fragment.setArguments(args);
        return fragment  /*newInstance(position)*/ /* getInstance(position)*/  /*fragments.get(position)*/;
    }

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

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

    @Override
    public Fragment instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container,
                position);
        fm.beginTransaction().show(fragment).commit();
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // super.destroyItem(container, position, object);
        Fragment fragment = fragments.get(position);
        fm.beginTransaction().hide(fragment).commit();
    }

}
核心方法是instantiateItem和destroyItem,因为这里面用到了show和hidden
而在fragments集合中保存的CategoryLeftMenuFragment 中有这么一个fragment单例的创建方法,该方法主要在activity中创建fragment集合的时候来调用的,
具体代码如下:

public static final String ARG_POSITION = "position";
public static CategoryLeftMenuFragment newInstance(int position) {
    CategoryLeftMenuFragment f = new CategoryLeftMenuFragment();
    Bundle b = new Bundle();
    b.putInt(ARG_POSITION, position);
    f.setArguments(b);
    return f;
}
四:最后说明一下第一步布局文件上的懒加载LazyViewpager,正是这个viewpager实现了禁止viewpager默认的缓存功能。该代码太长了,可以去百度下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值