转载本博客,请注明出处:http://blog.csdn.net/qq_32059827点击打开链接
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>
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;//返回显示 } } }
看来效果还不错,那么就紧跟脚步,把结论写在了一张图片上,那么就用一张图片来解释一下ViewPage是怎么加载的:
现在对ViewPage用法应该是比较清楚了,您可以自己加上log日志,验证上边图片总结的内容哦。
个人水平总有限,有更好的解释方式还望您的指正。
欢迎关注本博客点击打开链接 http://blog.csdn.net/qq_32059827,每天花上5分钟,阅读一篇有趣的安卓小文哦。