ViewPager 详解(二)

(ViewGroupcontainer, int position,Objectobject)

Remove a page for the given position. The adapter is responsible for removing the view from its container, although it only must ensure this is done by the time it returns from.

Parameters

containerThe containing View from which the page will be removed.

positionThe page position to be removed.

objectThe same object that was returned by.

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

下面看看《ViewPager 详解(一)—基本入门》中是如何做的:

@Overridepublic void destroyItem(ViewGroup container, int position,Object object) {// TODO Auto-generated method stubcontainer.removeView(viewList.get(position));}果不其然,我们将给定位置的视图从container中移除了……

然后看getCount ()

public abstract intgetCount()

Return the number of views available.

返回当前有效视图的个数。

在上一章例子中,我们是这么做的:

@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();}返回了当前要滑动视图的个数,与SDK说明一致。

最难的两个来了

instantiateItem (ViewGroup container, int position)

publicObjectinstantiateItem(ViewGroupcontainer, int position)

Create the page for the given position. The adapter is responsible for adding the view to the container given here, although it only must ensure this is done by the time it returns from.

Parameters

containerThe containing View in which the page will be shown.

positionThe page position to be instantiated.

ReturnsReturns an Object representing the new page. This does not need to be a View, but can be some other container of the page.

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

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

心得 :

1、从说明中可以看到,在代码中,我们的责任是将指定position的视图添加到conatiner中

2、Key的问题:从这个函数就可以看出,该函数返回值就是我们根据参数position增加到conatiner里的View的所对应的Key!!!!!!!

3、“it only must ensure this is done by the time it returns fromfinishUpdate(ViewGroup).”这句话在destroyItem()的函数说明中同样出现过,这说明在finishUpdate(viewGroup)执行完后,有两个操作,一个是原视图的移除(不再显示的视图),另一个是新增显示视图(即将显示的视图)

在上一章的代码中,我们是这样做的:

@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(viewList.get(position));return viewList.get(position);}};(Viewview,Objectobject)

Determines whether a page View is associated with a specific key object as returned by. This method is required for a PagerAdapter to function properly.

Parameters

viewPage View to check for association withobject

objectObject to check for association withview

Returnstrue ifviewis associated with the key objectobject

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

返回值:如果对应的是同一个View,返回True,否则返回False。

在上章节的例子中,我们这样做的:

@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;}由于在instantiateItem()中,我们作为Key返回来的是当前的View,所以在这里判断时,,我们直接将Key与View看是否相等来判断是否是同一个View。二、自定义Key实例

经过上面的讲解,想必大家给Key的概念应该有个清楚的理解,下面举个例子来说明Key与View的关系,由于Key与View要一一对应,所以我把每个视图所处的位置Position作为Key,在上章例子的基础上更改的,下面先看全部代码,然后看部分讲解:

package com.example.testviewpage_2;/** * @author harvic * @date 2014.8.11 */import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class MainActivity extends Activity {private View view1, view2, view3;private List<View> viewList;// view数组private ViewPager viewPager; // 对应的viewPager@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = (ViewPager) findViewById(R.id.viewpager);LayoutInflater inflater = getLayoutInflater();view1 = inflater.inflate(R.layout.layout1, null);view2 = inflater.inflate(R.layout.layout2, null);view3 = inflater.inflate(R.layout.layout3, null);viewList = new ArrayList<View>();// 将要分页显示的View装入数组中viewList.add(view1);viewList.add(view2);viewList.add(view3);PagerAdapter pagerAdapter = new PagerAdapter() {@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stub//根据传来的key,找到view,判断与传来的参数View arg0是不是同一个视图return arg0 == viewList.get((int)Integer.parseInt(arg1.toString()));}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn viewList.size();}@Overridepublic void destroyItem(ViewGroup container, int position,Object object) {// TODO Auto-generated method stubcontainer.removeView(viewList.get(position));}@Overridepublic Object instantiateItem(ViewGroup container, int position) {// TODO Auto-generated method stubcontainer.addView(viewList.get(position));//把当前新增视图的位置(position)作为Key传过去return position;}};viewPager.setAdapter(pagerAdapter);}}在这里更改了两个地方:快忘了那些不高兴的事吧!你看就连今天的阳光都如此明媚灿烂,

ViewPager 详解(二)

相关文章:

你感兴趣的文章:

标签云: