ViewPager介绍:
1)ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。
2)ViewPager类需要一个PagerAdapter适配器类给它提供数据。
3)ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
在编写ViewPager的应用的使用,还需要使用两个组件类分别是PagerTitleStrip类和PagerTabStrip类,PagerTitleStrip类直接继承自ViewGroup类,而PagerTabStrip类继承PagerTitleStrip类,所以这两个类也是容器类。但是有一点需要注意,在定义XML的layout的时候,这两个类必须是ViewPager标签的子标签,不然会出错。
由下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="wrap_content" android:layout_height="wrap_content" > <android.support.v4.view.PagerTabStrip android:id="@+id/tabstrip" android:layout_width="wrap_content" android:layout_height="50dip" android:gravity="center" /> </android.support.v4.view.ViewPager> </RelativeLayout>
做个简单的案例:
先看看效果,如下图:
第一个View向第二个View滑动
第二个View向第三个View滑动
一、新建项目,引入ViewPager控件ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。
1. activity_main.xml加入ViewPager的布局:
<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/viewPager" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
注:其中 <android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置
2. 新建三个layout,用于滑动切换的视图
布局代码分别如下:
layout01.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f00"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第一页" android:textSize="70sp" android:textColor="#fff" /> </LinearLayout>
layout02.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f00">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二页"
android:textSize="70sp"
android:textColor="#fff" />
</LinearLayout>
layout03.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f00"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第三页" android:textSize="70sp" android:textColor="#fff" /> </LinearLayout>
二、代码实战
MainActivity.java:
package com.signal027.viewpagerdemo_01; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private ViewPager mViewPager;//对应的ViewPager private View mView1, mView2, mView3; //对应我们的三个Layout private List<View> mViewList;//View集合 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //查找ViewPager控件 mViewPager = (ViewPager) findViewById(R.id.viewPager); //初始化过程,就是将资源与变量联系起来布局 LayoutInflater inflater = getLayoutInflater(); //View绑定布局 mView1 = inflater.inflate(R.layout.layout01, null); mView2 = inflater.inflate(R.layout.layout02, null); mView3 = inflater.inflate(R.layout.layout03, null); //将3个view加入集合 mViewList = new ArrayList<>(); mViewList.add(mView1); mViewList.add(mView2); mViewList.add(mView3); MyPagerAdapter pagerAdapter = new MyPagerAdapter(MainActivity.this, mViewList); //适配 mViewPager.setAdapter(pagerAdapter); } }
MyPagerAdapter.java
package com.signal027.viewpagerdemo_01; import android.content.Context; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * Created by Bill on 2016/5/22. */ public class MyPagerAdapter extends PagerAdapter{ private List<View> mViewList; public MyPagerAdapter(Context context,List<View> mViewList){ this.mViewList = mViewList; } //返回要滑动View的个数 @Override public int getCount() { return mViewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } //做了两件事:1.将View添加到container中,2.返回当前View @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(mViewList.get(position)); return mViewList.get(position); } //从当前container中删除指定位置(position)的View @Override public void destroyItem(ViewGroup container, int position, Object object) { // super.destroyItem(container, position, object); container.removeView(mViewList.get(position)); } }
注:适配器这个东东想必大家都不莫生,在ListView中也有适配器,listView通过重写GetView()函数来获取当前要加载的Item。而PageAdapter不太相同,毕竟PageAdapter是单个VIew的合集。
PageAdapter 必须重写的四个函数:
boolean isViewFromObject(View arg0, Object arg1)
int getCount()
void destroyItem(ViewGroup container, int position,Object object)
Object instantiateItem(ViewGroup container, int position)