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

来源:互联网 发布:围棋软件免费下载 编辑:程序博客网 时间:2024/06/11 12:07

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

阅读全文
0 0
原创粉丝点击