这几天修改应用中的一个Bug,涉及到ViewPager的相关知识,猛然间发现自己对ViewPager相关属性和使用有点模
糊。估计是以前缺乏总结,要用到相关的知识才去了解,达成目的之后,就放下再也不管了。没有总结就没有积
累,没有积累,就没有提高!好了,闲话不多说了,切入正题。既然已经用过ViewPager,现在吃回头草再来研究
ViewPager就应研究个透,打算将ViewPager的总结分几篇写,研究到哪个程度就写到哪个程度吧。今天是第一篇。
先看下效果图。
一 新建项目,引入ViewPager。
ViewPager是android.support.v4.view包中的类,可以用来实现屏幕间的切换。在主布局文件中添加ViewPager,
如下所示的。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context="com.example.testviewpage_1.MainActivity" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</RelativeLayout>
其中<android.support.v4.view.ViewPager />是ViewPager对应的组件,要将其放到想滑动的位置。
二 构建三个layout,用于滑动切换的界面。
1.layout1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical" >
</LinearLayout>
2.layout2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff00"
android:orientation="vertical" >
</LinearLayout>
3.layout3.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff00ff"
android:orientation="vertical" >
</LinearLayout>
三个要滑动的界面非常简单,里面没有任何的控件。你也可以往里面添加各种控件,这里只为了讲解相关的原
理,所以仅用背景颜色来区分不同的layout布局。
三 屏幕切换的实现
核心代码如下。
package com.example.testviewpage_1;
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 ViewPager viewPager; // 对应的viewPager
private List<View> viewList;// view数组
@Override
protected 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() {
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getCount() {
return viewList.size();
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
return viewList.get(position);
}
};
viewPager.setAdapter(pagerAdapter);
}
}
现在开始逐步分析上述代码。
private View view1, view2, view3;
private ViewPager viewPager; // 对应的viewPager
private List<View> viewList;// view数组
如上所述,view1,view2 ,view3对应我们的三个layout,即layout1.xml,layout2.xml,layout3.xml
viewList是一个View数组,盛装上面的三个View。
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);
上述初始化过程难度不大,就是将资源与变量联系起来布局,最后将实例化的view1,view2,view3添加到
viewList中。
3.1 PagerAdapter——ViewPager的适配器
适配器这东东,想必大家都不会陌生。PagerAdapter比较特殊,必须重写如下四个方法。
- instantiateItem(ViewGroup, int)
- destroyItem(ViewGroup, int, Object)
- getCount()
- isViewFromObject(View, Object)
看看我们是怎样重写上述方法的。
instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View。
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
return viewList.get(position);
}
destroyItem():从当前container中删除指定位置(position)的View。
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
getCount():返回要滑动的View的个数。
@Override
public int getCount() {
return viewList.size();
}
isViewFromObject():对于这个方法就先不做讲解,大家目前先知道它要这样重写就行了,后面我们会对它进行改写。
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
源码下载地址:http://download.youkuaiyun.com/detail/yangtinghui7/9700519