ViewPager 详解(二)——四大函数

系列文章:

  1. ViewPager 详解(一)——基本入门
  2. ViewPager 详解(二)——四大函数
  3. ViewPager 详解(三)——PagerTabStrip与PagerTitleStrip添加标题栏
  4. ViewPager 详解(四)——自主实现滑动指示条X
  5. ViewPager 详解(五)——使用Fragment实现ViewPager滑动

pageradapter四大函数

每个滑动页面都对应一个Key,而且这个Key值是用来唯一追踪这个页面的,也就是说每个滑动页面都与一个唯一的Key一一对应

destroyItem()
该方法实现的功能是移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了确保在finishUpdate(viewGroup)返回时视图能够被移除

@Override  
public void destroyItem(ViewGroup container, int position,  
        Object object) {  
    // TODO Auto-generated method stub  
    container.removeView(viewList.get(position));  
}  

getCount ()

返回当前有效视图的个数

@Override  
public int getCount() {  
    // TODO Auto-generated method stub  
    return viewList.size();  
}  

instantiateItem (ViewGroup container, int position)

这个函数的实现的功能是创建指定位置的页面视图。适配器有责任增加即将创建的View视图到这里给定的container中,这是为了确保在finishUpdate(viewGroup)返回时this is be done!

返回值:返回一个代表新增视图页面的Object(Key),这里没必要非要返回视图本身,也可以这个页面的其它容器。其实我的理解是可以代表当前页面的任意值,只要你可以与你增加的View一一对应即可,比如position变量也可以做为Key

在代码中,我们的责任是将指定position的视图添加到conatiner中

该函数返回值就是我们根据参数position增加到conatiner里的View的所对应的Key

在 finishUpdate(viewGroup)执行完后,有两个操作,一个是原视图的移除(不再显示的视图),另一个是新增显示视图(即将显示的视图)

@Override  
public Object instantiateItem(ViewGroup container, int position) {  
    // TODO Auto-generated method stub  
        container.addView(viewList.get(position));  
          
          
        return viewList.get(position);  
    }  
}; 

在这里,我们做了两件事
第一:将参数里给定的position的视图,增加到conatiner中,供其创建并显示

第二:返回当前position的View做为此视图的Key。还记得API官方文档中下面这段话么?
对于非常简单的pageradapter或许你可以选择用page本身作为键,在创建并且添加到viewgroup后instantiateItem方法里返回该page本身即可destroyItem将会将该page从viewgroup里面移除。isViewFromObject方法里面直接可以返回view == object

这里就把当前的View当作Key传过出去

isViewFromObject (View view, Object object)

功能:该函数用来判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
返回值:如果对应的是同一个View,返回True,否则返回False

@Override  
public boolean isViewFromObject(View arg0, Object arg1) {  
    // TODO Auto-generated method stub  
    return arg0 == arg1;  
}  

由于在instantiateItem()中,我们作为Key返回来的是当前的View,所以在这里判断时,我们直接将Key与View看是否相等来判断是否是同一个View

自定义Key实例

public class MainActivity extends Activity {
    private View view1,view2,view3;
    private ViewPager viewPager;
    private List<View> viewList;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager)findViewById(R.id.viewpager);
        LayoutInflater layoutInflater = getLayoutInflater();
        view1 = layoutInflater.inflate(R.layout.layout1,null);
        view2 = layoutInflater.inflate(R.layout.layout2,null);
        view3 = layoutInflater.inflate(R.layout.layout3,null);

        viewList = new ArrayList<View>();
        viewList.add(view1);
        viewList.add(view2);
        viewList.add(view3);

        PagerAdapter pagerAdapter = new PagerAdapter() {

            @Override
            public boolean isViewFromObject(View view, Object object) {
                //return view == object;
                //根据传来的key,找到view,判断与传来的参数View view是不是同一个视图
                return view == viewList.get((int)Integer.parseInt(object.toString()));
            }

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

            @Override
            public void destroyItem(ViewGroup container, int position,
                                    Object object) {
                container.removeView(viewList.get(position));
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                container.addView(viewList.get(position));
                //return viewList.get(position);
                return position;
            }
        };

        viewPager.setAdapter(pagerAdapter);
    }
}

改动了两个地方
1、先看Key的产生的位置instantiateItem()

@Override
            public Object instantiateItem(ViewGroup container, int position) {
                container.addView(viewList.get(position));
                //return viewList.get(position);
                return position;
            }
        };

我们在上讲也讲了在这个函数中Key是作为返回值与当前装入Container中的视图对应起来的。所以在这里我们返回postion与container.addView(viewList.get(position));里的viewList.get(position)这个视图对应起来

2、isViewFromObject ()

@Override
            public boolean isViewFromObject(View view, Object object) {
                //return view == object;
                //根据传来的key,找到view,判断与传来的参数View view是不是同一个视图
                return view == viewList.get((int)Integer.parseInt(object.toString()));
            }

判断从instantiateItem()返回来的Key与当前的View是否能对应起来,我们知道从instantiateItem传过来的其实是position,所以我们要根据position找到View,然后跟参数中的View view判断

但在真正操作时出现了问题,我们要先将obect对应转换为int类型:(int)Integer.parseInt(object.toString());然后再根据position找到对应的View

总结自:启航大神的博客http://blog.csdn.net/harvic880925/article/details/38487149

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值