Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android初级教程:ViewPage使用详解

$
0
0

转载本博客,请注明出处: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>

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;//返回显示
		}
		
	}
}

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

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


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

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


欢迎关注本博客点击打开链接  http://blog.csdn.net/qq_32059827,每天花上5分钟,阅读一篇有趣的安卓小文哦。


作者:qq_32059827 发表于2016/8/24 19:19:32 原文链接
阅读:36 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>