ViewPager可以实现不同页面的滑动,其原理和ListView很像,也需要适配器,为PagerAdapter,下面通过一个简单的例子来梳理一下ViewPager。
我先把整体的代码例子贴出来,然后详细说明。
新建一个项目。
1.在主布局文件中添加ViewPager控件:
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
2.新建三个简单的布局,用来作为滑动显示的页面。
layout_1.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e2e210">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
layout_2.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f98292">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="让我们红尘作伴,活的潇潇洒洒,策马奔腾,共享人世繁华"/>
</LinearLayout>
layout_3.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0ac2e2">
</LinearLayout>
3.然后在MainActivity.java文件中添加代码:
public class MainActivity extends AppCompatActivity {
private View view1,view2,view3;//对应三个layout
private ViewPager viewPager;//对应的viewpager
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager)findViewById(R.id.view_pager);
//把变量与布局联系起来
//这里的LayoutInflater系列方法是把xml文件转换成view对象
LayoutInflater layoutInflater = getLayoutInflater();
view1 = layoutInflater.inflate(R.layout.layout_1,null);
view2 = layoutInflater.inflate(R.layout.layout_2,null);
view3 = layoutInflater.inflate(R.layout.layout_3,null);
List<View> viewList = new ArrayList<View>();//把三个view加载到viewlist中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
PagerAdapter pagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
return viewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
//这里要先把从instantiateItem返回的key值object转化成int类型(int)Integer.parseInt(object.toString()),再判断与view是否相等
return view== viewList.get((int)Integer.parseInt(object.toString()));//这里返回很重要
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 移除指定位置的view
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));//添加指定位置的view,并且返回
return viewList.get(position);
}
};
viewPager.setAdapter(pagerAdapter);
}
}
可以看到这句:
首先还是把View的对象添加到viewList中。
List<View> viewList = new ArrayList<View>();//把三个view加载到viewlist中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
然后,是下面这句话。viewPager的适配器PagerAdapter.
PagerAdapter pagerAdapter = new PagerAdapter();
里面有四个最基本的函数需要重写:
1)这是返回viewList里面存储的View对象的个数,就是会显示页面的个数,这么写就可以。
@Override
public int getCount() {
return viewList.size();
}
2)这个是销毁当前position位置的页面。
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 移除指定位置的view
container.removeView(viewList.get(position));
}
3)加载position位置的页面,并且返回这个view
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));//添加指定位置的view,并且返回
return viewList.get(position);
}
4)这句话是判断public Object instantiateItem()函数返回的view是否是来自Object
@Override
public boolean isViewFromObject(View view, Object object) {
return view== object;//一般这么写就行
}
最后,把适配器加载到viewPager中。
viewPager.setAdapter(pagerAdapter);
点击运行,就可以实现三个页面的来回切换了。