Android-ViewPager(翻页控件)

ViewPager(翻页控件)

ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view

1.ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。

2.ViewPager类需要一个PagerAdapter适配器类给它提供数据。

3.ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。

ViewPager经常用来连接Fragment,它很方便管理每个页面的生命周期,使用ViewPager管理Fragment是标准的适配器实现。最常用的实现一般有FragmentPagerAdapter和FragmentStatePagerAdapte

实现一个最基本的PagerAdapter,《必须实现四个方法》,在代码里有注释
public class AdapterViewpager extends PagerAdapter {
private List mViewList;

public AdapterViewpager(List<View> mViewList) {
    this.mViewList = mViewList;
}

@Override
public int getCount() {//必须实现
    return mViewList.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {//必须实现
    return view == object;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {//必须实现,实例化
    container.addView(mViewList.get(position));
    return mViewList.get(position);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {//必须实现,销毁
    container.removeView(mViewList.get(position));
}

}

实现一个最基本的FragmentPagerAdapter
public class AdapterFragment extends FragmentPagerAdapter {
private List mFragments;

public AdapterFragment(FragmentManager fm, List<Fragment> mFragments) {
    super(fm);
    this.mFragments = mFragments;
}

@Override
public Fragment getItem(int position) {//必须实现
    return mFragments.get(position);
}

@Override
public int getCount() {//必须实现
    return mFragments.size();
}

@Override
public CharSequence getPageTitle(int position) {//选择性实现
    return mFragments.get(position).getClass().getSimpleName();
}

}

两个适配器的源码

FragmentStatePagerAdapter

@Override
public Object instantiateItem(ViewGroup container, int position) {
// If we already have this item instantiated, there is nothing
// to do. This can happen when we are restoring the entire pager
// from its saved state, where the fragment manager has already
// taken care of restoring the fragments we previously had instantiated.
if (mFragments.size() > position) {
Fragment f = mFragments.get(position);//fragment被释放后这里得到的null值
if (f != null) {
return f;
}
}

  if (mCurTransaction == null) {
      mCurTransaction = mFragmentManager.beginTransaction();
  }

  Fragment fragment = getItem(position);//fragment被释放后或者是初次进入页面拿到新的Fragment实例
  if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
  if (mSavedState.size() > position) {
      Fragment.SavedState fss = mSavedState.get(position);
      if (fss != null) {
          fragment.setInitialSavedState(fss);
      }
  }
  while (mFragments.size() <= position) {
      mFragments.add(null);
  }
  fragment.setMenuVisibility(false);
  fragment.setUserVisibleHint(false);
  mFragments.set(position, fragment);
  mCurTransaction.add(container.getId(), fragment);//新的Fragment实例 是add上去的

  return fragment;

}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;

  if (mCurTransaction == null) {
      mCurTransaction = mFragmentManager.beginTransaction();
  }
  if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
          + " v=" + ((Fragment)object).getView());
  while (mSavedState.size() <= position) {
      mSavedState.add(null);
  }
  mSavedState.set(position, fragment.isAdded()
          ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
  mFragments.set(position, null);//真正释放了fragment实例

  mCurTransaction.remove(fragment);

}

FragmentPagerAdapter

@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}

  final long itemId = getItemId(position);

  // Do we already have this fragment?
  String name = makeFragmentName(container.getId(), itemId);
  Fragment fragment = mFragmentManager.findFragmentByTag(name);
  if (fragment != null) {
      if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
      mCurTransaction.attach(fragment);//因为fragment实例没有被真正释放,所以可以直接atta
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值