###概述:
- Android开发中,几乎每一个项目都要用到ViewPager,可以说,ViewPager是和TextView控件一样的属于最基本的控件,当然viewpager的使用是要比TextView这样的控件复杂很多;
- ViewPager的使用是要搭配适配器来使用的,而我们常用的适配器有PagerAdapter和FragmentPagerAdapter,本文只是从一个入门级别,最基本的使用来做一个示范;
###正文:
####(一)PagerAdapter的使用 - 首先第一步是在布局文件里声明;
activity_main.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.pxj.a01_viewpager.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ViewPager的适配器"
android:gravity="center"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:textSize="30sp"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
- 其次就是在代码中使用,直接上代码;
MainActivity.java文件如下:
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private String datas[]={"一","二","三","四","五"}; //模拟的数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
viewPager = (ViewPager) findViewById(R.id.viewpager);
//给viewpager设置适配器
viewPager.setAdapter(new VpAdapter());
}
/**
* viewPager的PagerAdapter适配器
*/
private class VpAdapter extends PagerAdapter{
/**
* 返回viewpager要显示几页
*/
@Override
public int getCount() {
return datas.length;
}
/**
* 该函数用来判断instantiateItem(ViewGroup, int)
* 函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
*/
@Override
public boolean isViewFromObject(View view, Object object) {
//几乎是固定的写法,
return view==object;
}
/**
* 返回要显示的view,即要显示的视图
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.item_vp,null);
//在这里可以做相应的操作
TextView tv= (TextView) view.findViewById(R.id.tv);
//数据填充
tv.setText(datas[position]);
container.addView(view); //这一步很重要
return view;
}
/**
* 销毁条目
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
}
- 适配器中用到的xml文件;
item_vp.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#3f00">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="40sp"
android:textColor="#000"/>
</RelativeLayout>
####(二)FragmentPagerAdapter适配器:
- 使用FragmentPagerAdapter适配器其实就是将viewpager的每一页每一个条目当成了一个Fragment;
- 同样的,首先我们现在布局文件里声明viewpager;
activity_main.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context="com.pxj.a01_viewpager.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ViewPager的适配器"
android:gravity="center"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:textSize="30sp"/>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
- 其次我们要用到Fragment,所以我们先把Fragment创建出来;
VpFragment.java文件如下:
public class VpFragment extends Fragment {
private View view;
private String data; //数据
public VpFragment() { //无参构造人为写出来
}
public VpFragment(String data) { //创建一个有参构造传递数据
this.data = data;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = LayoutInflater.from(getContext()).inflate(R.layout.item_vp, null);
//初始化
TextView tv = (TextView) view.findViewById(R.id.tv);
//数据绑定
tv.setText(data);
return view;
}
}
- 上述过程中用到的xml文件;
item_vp.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#3f00">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="40sp"
android:textColor="#000"/>
</RelativeLayout>
- 最后就是在代码里使用viewpager了;
MainActivity.java文件如下:
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
private String datas[] = {"一", "二", "三", "四", "五"}; //模拟的数据
private List<VpFragment> vpFragments=new ArrayList<>(); //碎片集合
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
viewPager = (ViewPager) findViewById(R.id.viewpager);
//根据数据,我们是可以知道我们要返回多少页的,所以我们就创建多少个碎片
for(int position=0;position<datas.length;position++){
vpFragments.add(new VpFragment(datas[position]));
}
//给viewpager设置适配器
viewPager.setAdapter(new VpAdapter(getSupportFragmentManager()));
}
/**
* viewPager的PagerAdapter适配器
*/
private class VpAdapter extends FragmentPagerAdapter {
public VpAdapter(FragmentManager fm) {
super(fm);
}
/**
* 返回要显示的碎片
*/
@Override
public Fragment getItem(int position) {
return vpFragments.get(position);
}
/**
* 返回要显示多少页
* @return
*/
@Override
public int getCount() {
return datas.length;
}
}
}
###最后:
- 以上就是viewpager的两种适配器最基本的使用,当然,还有一种FragmentStatePagerAdapter适配器,用法和FragmentPagerAdapter用法是一致的,但是有内存上的一个区别,具体的还是上网搜搜吧;
- 关于PagerAdapter和FragmentPagerAdapter两种适配器,什么时候用?我也是在探索阶段,据我的朋友说,谷歌官方是推荐用FragmentPagerAdapter的,具体的原因因为工作太忙我还没查看,不过我根据我现在的经验来说,假如只是一些很普通的viewpager,没有冗杂的交互,那么PagerAdapter就可以,但是涉及到过多的交互,那么用FragmentPagerAdapter,因为Fragment和Activity之间能更好的彼此控制(只是目前个人片面理解);
- 如果以上有不足之处或是错误之处,还望指教;