一:布局文件为:
<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默认的缓存功能。该代码太长了,可以去百度下。