ViewPager是安卓3.0以上可以使用的控件,功能就是使视图左右滑动.在android.support.v4.view包下,是个扩展的自定义控件.故使格式:在布局文件里应该是android.support.v4.view.ViewPager
注意ViewPager的内部pager页面不能使用Activity与Fragment原因:
不能使用activity的原因:viewpager中存放是的view控件,activity不能返回view,activity是不能在veiwpager中使用
不能使用Fragment的原因:(以下是特有现象,但如果不是这种fragment多次嵌套fragment的话,可以使用fragment)
因为之前已经使用了HomeFragment,在接下来的操作还会有新界面创建,这样就会出现一个Fragment中使用了另一fragment,另一个fragment中又使用了一个fragment的现象,对于小内存的手机来说,容易内存溢出(OOM).
1.在所要使用的Activity的布局xml文件里定义这个组件,
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
2.在Activity里找到ViewPager控件,并得到ViewPager控件对象.
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
3.准备数据,创建ArrayList集合,在创建一个承载数据类型的bean类,把数据添加到bean类中,再把bean类挨个添加到集合中.
4.为ViewPager设置Adapter适配器
vewPager.setAdapter(new 自定义的适配器类());
5.创建一个自定义的ViewPager适配器内部类,要继承ViewPager,并复写其方法
class MyAdapter extends PagerAdapter{
//ViewPager滑动的次数
public int getCount() {
//设置数小的话,图片到头了就没法循环出现,要想循环播放,一般指定50000次即可.return 50000;
//且报空指针异常的地方(一般和获取ViewPager当前选中的是第几页有关的都要改为position(当前页数)%list.size()(取余数)
return list.size();
}
提示:如果想要ViewPager能向左滑动,只需要在主线程,
改变ViewPager的默认选中位置即可:viewPager.setCurrentItem(int);
//该函数用来判断instantiateItem(ViewGroup, int)函数所返回来的Key // 与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
public boolean isViewFromObject(View view, Object object) {
return view == object;//这里是固定写法,一般不用变,写死了.
}
创建Pager的方法,相当于BaseAdapter的getView方法,很重要.(就是没有position类似的参数,所以没有优化)一般在该方法中要加载并返回View对象,并且要绑定数据,但是不需要复用Pager了,且返回container没有用.
//注意:是参数为ViewGroup container(container代表了ViewPager控件自身)的instantiateItem方法第二个,不要弄错了
public Object instantiateItem(ViewGroup container, int position) {
//1.加载View
ImageView imageView = new ImageView(MainActivity.this);
imageView.setScaleType(ScaleType.FIT_XY);//设置所包裹的图片占满整个屏幕
//2.绑定数据到View
imageView.setImageResource(list.get(position).getIconId());
//注意:必须要将控件对象添加到VIewPager中来
container.addView(imageView);
return imageView;
}
/**防止内存泄漏.相当于ListView的复用container
* 销毁一个page,该方法的实际就是将instantiateItem返回的VIew对象从ViewPager中移除,
container:还是ViewPager控件自身,object:则代表了View控件,使用时要强转成View一下
补充:为什么参数是Object,而不直接是View,因为虽然99%是view,但也有可能是Fragment,所以用Object,提高了可扩展性.
*/
public void destroyItem(ViewGroup container, int position, Object object) {
//super.destroyItem(container, position, object);此方法一定要删掉.
container.removeView((View) object);
}
6.为ViewPager设置页面切换监听器.并在onPageSelected里进行文本的设置(所有的 position : 条目的位置)
viewPager.addOnPageChangeListener(new OnPageChangeListener() {//也可以是setOnPageChangeListener,二者是一样的,只不过set被淘汰了
//Viewpager的页面pager切换完成时,执行该方法
public void onPageSelected(int position) {
Log.e("log","当页面改变时执行:onPageSelected");
updateTitleAndDot()//记得在第4步,为ViewPager设置Adapter适配器下面,调用该方法,使ViewPager一创建,第一个页面就有文本数据
}
//ViewPager控件处于滑动中,执行该方法
参数信息 positionOffset:页面移动距离的百分比例 positionOffsetPixels : 移动的偏移的像素
注意:positionOffsetPixels,positionOffset:会随着页面向右滑动而不断增加(无限接近于1),但当完全滑动到另一页时,数据就变成了0.0
public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {
Log.d("log","当页面处于滑动中时执行:onPageScrolled");
}
//当ViewPager控件被点击或松开时(也可以理解为pager滑动状态改变时),执行该方法
public void onPageScrollStateChanged(int state) {
Log.i("log","当页面时执行:onPageScrollstateChanged");
}
}
);