ViewPager有两个常用的适配器,这两个适配器都继承于PagerAdapter,并将Fragment作为数据源:
- FragmentPagerAdapter: 这种适配器从始至终保存所有页面的Fragment的实例。当页面形式固定且数量较小的时候,可以选择这种适配器。
- FragmentStatePagerAdater: 这种适配器只会保存当前、前一个和后一个页面的Fragment。当页面数量较多或者需要动态改变数量时,可以选择。
二者的使用方法是完全相同的,下面以FragmentPagerAdapter说明。
创建Fragment,并为Fragment加载布局
在xml文件中定义Fragment使用的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="30sp" />
</RelativeLayout>
创建Fragment,并加载此布局:
public class MyFragment extends Fragment {
private int num;
public MyFragment(int num){
this.num = num;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.view_1, container, false);
TextView textView = (TextView) v.findViewById(R.id.text_view);
textView.setText("This is the #" + (num + 1) + " view");
return v;
}
}
创建适配器
创建一个类继承于FragmentPagerAdapter,重写其中的getItem() 和getCount() 方法。getItem() 方法返回一个Fragment对象作为页面的内容,getCount() 返回页面的个数。
如果设置了选项卡导航栏,还可以重写getPageTitle() 来返回选项卡的标题:
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return new MyFragment(position);
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
String title = "Tab #" + (position + 1);
return title;
}
}
PS: 这里每个页面使用了相同的布局,仅仅是改变了布局中显示的内容。如果每个页面要使用不同的布局,也可以为每一个布局文件创建一个Fragment,并将所有的Fragment保存在一个集合中,然后在getItem方法中返回不同的Fragment对象。
绑定适配器
adapter1 = new MyFragmentPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter1);
MyFragmentPagerAdapter接收一个FragmentManager对象作为构造参数。为了使程序能够兼容,需要让MainActivity继承FragmentActivity,并且使用getSupportFragmentManager() 方法。