​

ViewPage使用之一就是轮播广告,就以此为出发点,来详细解析一下ViewPage的使用和加载机制。

首先直接上一个damo,在代码中我也直接给出了详细的解释。然后,再在案例后边,对加载机制做一个解释。

Demo:

首先,配置文件:(注意引入全类名)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent" >      <android.support.v4.view.ViewPager         android:id="@+id/viewPage"         android:layout_width="match_parent"         android:layout_height="200dip" >     </android.support.v4.view.ViewPager>  </RelativeLayout>


mainactivity活动代码:

package com.itydl.viewpage;  import java.util.ArrayList; import java.util.List;  import android.os.Bundle; import android.app.Activity; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ImageView.ScaleType;  public class MainActivity extends Activity {    //数据源  List<ImageView> mImageViewLists = new ArrayList<ImageView>();  //准备数据,图片资源(一般来自服务器端)  int[] imagsIds = {    R.drawable.a,    R.drawable.b,    R.drawable.c,    R.drawable.d,    R.drawable.e  };      private ViewPager mViewPager;   @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         initView();//初始化界面         initDatas();//初始化数据                       }   private void initDatas() {   // 往集合里面添加Imageview对象   ImageView iv =null;   for(int i =0;i<imagsIds.length;i++){    iv = new ImageView(this);    iv.setImageResource(imagsIds[i]);    //强制要求图片matchparent    iv.setScaleType(ScaleType.FIT_XY);    //这样集合中就存在了5个ImageView对象    mImageViewLists.add(iv);   }  }   private void initView() {   setContentView(R.layout.activity_main);   //获取viewpage实例   mViewPager = (ViewPager) findViewById(R.id.viewPage);      //PagerAdapter关联ViewPager,数据源间接绑定到ViewPager   mViewPager.setAdapter(new MyAdapter());  }   private class MyAdapter extends PagerAdapter{    @Override   public int getCount() {    // TODO Auto-generated method stub    return mImageViewLists.size();   }    /**    * (看得见的view)    * 为true的时候,复用View对象显示选中的;false时,可能显示左右加载的(看往那边拖拽)    * view 当手指开始滑动时,被拖拽的View对象    * obj 当前被选中的item。    * 这个方法会决定哪个View加载进来,只有当前选中的view与当前的item相同时才会显示当前的view    */   @Override   public boolean isViewFromObject(View view, Object object) {    // TODO Auto-generated method stub    return view == object;   }    /**(看不见的view)    * 销毁对应position位置的item(默认加载三张,三张外的之前先被加载的view就会被销毁,传递过来的position等于那个销毁的position)    * container 就是当前创建的ViewPager    * object: 标记。预销毁的view会传递到这里    */   @Override   public void destroyItem(ViewGroup container, int position, Object object) {    //下边这行代码是个坑——不可以保留,一定要注销掉才可以使用,如果不注销掉,抛出异常。    //super.destroyItem(container, position, object);    // 移除掉ViewPager中position的item对象    container.removeView((ImageView) object);   }    /**(看不见的view)    * 预加载时调用,默认加载三张;当前显示一view,会预加载后边马上要显示的位置的那张view    * 加载对应position位置的item    * object: 标记。预加载的view会传递给这里    */   @Override   public Object instantiateItem(ViewGroup container, int position) {    // 把position位置的对象加载出来,并且添加到ViewPager中    ImageView iv = mImageViewLists.get(position);    //Adds a child view. 向ViewPager中添加ImageView对象    container.addView(iv);    return iv;//返回显示   }     } }


详细的代码解释如上,现在运行看看结果:

Android初级教程:ViewPage使用详解_android

看来效果还不错,那么就紧跟脚步,把结论写在了一张图片上,那么就用一张图片来解释一下ViewPage是怎么加载的:

Android初级教程:ViewPage使用详解_加载_02


现在对ViewPage用法应该是比较清楚了,您可以自己加上log日志,验证上边图片总结的内容哦。

个人水平总有限,有更好的解释方式还望您的指正。