PageAdapter——PageView的适配器
四大方法:
PageAdapter 必须重写的四个函数:
- boolean isViewFromObject(View arg0, Object arg1)
- int getCount()
- void destroyItem(ViewGroup container, int position,Object object)
- Object instantiateItem(ViewGroup container, int position)
- CharSequence getPageTitle(int position) //主要用于标题。看需要
destroyItem():从当前container中删除指定位置(position)的View;
instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View
isviewfromobject(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
返回值:如果对应的是同一个View,返回True,否则返回False。
即:表示instantiateItem返回的值,与isViewFromObject中的view是否一样来判断是否为当前界面
如:
public class AdapterViewpager extends PagerAdapter {
private List<View> 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));
}
}
还可以这样:
- PagerAdapter pagerAdapter = new PagerAdapter() {
- @Override
- public boolean isViewFromObject(View arg0, Object arg1) {
- // TODO Auto-generated method stub
- //根据传来的key,找到view,判断与传来的参数View arg0是不是同一个视图
- return arg0 == viewList.get((int)Integer.parseInt(arg1.toString()));
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return viewList.size();
- }
- @Override
- public void destroyItem(ViewGroup container, int position,
- Object object) {
- // TODO Auto-generated method stub
- container.removeView(viewList.get(position));
- }
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- // TODO Auto-generated method stub
- container.addView(viewList.get(position));
- //把当前新增视图的位置(position)作为Key传过去
- return position;
- }
- };
- viewPager.setAdapter(pagerAdapter);
- }
PagerTabStrip与PagerTitleStrip 用于标题
区别:
只是PagerTabStrip是可交互的,而PagerTitleStrip是不可交互的区别。PagerTabStrip(是可点击与下划线指示条,点击会跳转到对应页面)。
1、XML布局
public class AdapterFragment extends FragmentPagerAdapter {
private List<Fragment> 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();
}
}
3个适配器的基本实现讲完了是不是很简单,那他们的区别是什么呢?
PagerAdapter是基类适配器是一个通用的ViewPager适配器,相比PagerAdapter,
PagerAdapter是基类适配器是一个通用的ViewPager适配器,相比PagerAdapter,
FragmentPagerAdapter和FragmentStatePagerAdapter更专注于每一页是Fragment的情况,而这两个子类适配器使用情况也是有区别的。FragmentPagerAdapter,保留了以前的Fragment对象.FragmentPagerAdapter适用于页面比较少的情况,FragmentStatePagerAdapter适用于页面比较多的情况。
mViewPager.setOffscreenPageLimit()/
FragmentStatePagerAdapter和FragmentPagerAdapter都是这样,但是FragmentPagerAdapter设置setOffscreenPageLimit不影响fragment缓存的个数(因为他一直会缓存),而FragmentStatePagerAdapter缓存的fragment实例个数就是setOffscreenPageLimit设置的值+1。另外setOffscreenPageLimit的缺省值是1,设置0是无效的会被强制赋值成1。
ViewPagerIndicator:
ViewPager pager = (ViewPager)findViewById(R.id.pager);
FragmentPagerAdapter adapter = new TabPageIndicatorAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
//实例化TabPageIndicator,然后与ViewPager绑在一起(核心步骤)
TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setViewPager(pager);
注意:
a)
必须在pager设置适配之后调用
b) 必须重写
getPageTitle()方法
@Override
public CharSequence getPageTitle(int position) {
return TITLE[position % TITLE.length];
}
c) 在activity中的:Fragmentmanager
FragmentManager fragmentManager = getSupportFragmentManager();
在Fragment的Fragmentmanager
FragmentManager fragmentManager = getChildFragmentManager();
参考:http://blog.csdn.net/harvic880925/article/details/38453725
http://www.jianshu.com/p/e5abbda4a71c