随着移动设备的普及,ViewPager的使用越来越频繁。PagerAdapter是ViewPager最常用的适配器之一,它的作用是将数据源中的数据以及每个页面的视图与ViewPager相关联。在这篇文章中,我们将从多个方面对PagerAdapter进行详细的阐述。
一、数据更新
PagerAdapter的数据通常来自于一个List或者数组。数据的更新可能会对PagerAdapter造成影响。为了更新数据,PagerAdapter提供了一种简单的方式。只需要更新数据源,然后调用notifyDataSetChanged()方法,PagerAdapter就会根据新数据源重新刷新所有视图。
// 初始化PagerAdapter
List dataList = new ArrayList<>();
dataList.add("Page One");
dataList.add("Page Two");
dataList.add("Page Three");
MyPagerAdapter adapter = new MyPagerAdapter(dataList);
// 修改数据源后通知adapter更新
dataList.set(0, "Updated Page");
adapter.notifyDataSetChanged();
上面的代码示例中,我们创建了一个包含三页数据的PagerAdapter,然后修改了数据源的第一个元素,最后通知adapter进行更新。调用notifyDataSetChanged()方法后,PagerAdapter会重新调用getItem()方法,重新创建所有的视图。
二、必须重写的两个方法
当继承PagerAdapter时,必须重写getItem()和getCount()方法。getItem()方法用于创建每个页面的视图,而getCount()方法则返回PagerAdapter中,项目的总数。
1. getItem()方法
getItem()返回的是一个Fragment或者View,也就是说PagerAdapter可以承载Fragment或View。这里我们以Fragment为例进行说明。
public class MyPagerAdapter extends PagerAdapter {
private List mDataList;
public MyPagerAdapter(List dataList) {
mDataList = dataList;
}
@Override
public Fragment getItem(int position) {
return PageFragment.newInstance(mDataList.get(position));
}
// getCount()方法继承
// isViewFromObject()方法继承
// destroyItem()方法继承
}
上面的代码示例中,我们重写了getItem()方法,返回的是一个PageFragment,PageFragment的内容取决于数据源在对应位置的值。
2. getCount()方法
getCount()方法必须提供当前PagerAdapter所包含的页面数量。如果数据源为null或者size为0,返回0。
public class MyPagerAdapter extends PagerAdapter {
private List mDataList;
public MyPagerAdapter(List dataList) {
mDataList = dataList;
}
@Override
public int getCount() {
return mDataList != null ? mDataList.size() : 0;
}
// getItem()方法继承
// isViewFromObject()方法继承
// destroyItem()方法继承
}
上面的代码示例中,我们重写了getCount()方法,根据数据源的size返回对应的Page个数。
三、缓存机制
PagerAdapter并不会立即销毁视图。相反,它利用了一种缓存机制,在适当的时候重新利用以前创建的Fragment或View。 简单来说,PagerAdapter最多保留三个页面的视图,当前页面,左侧页面和右侧页面。这是为了提高 ViewPager 的滑动(滑动时切换页面)的流畅度。
当getPageWidth()方法返回的值不等于1.0时,缓存机制反而失去了优势,因为它将不再保留左右两侧的视图。
public class MyPagerAdapter extends PagerAdapter {
private List mDataList;
public MyPagerAdapter(List dataList) {
mDataList = dataList;
}
@Override
public int getCount() {
return mDataList != null ? mDataList.size() : 0;
}
@Override
public float getPageWidth(int position) {
// 设置页面宽度为0.6,也就是一页滑动过去的宽度为0.6
return 0.6f;
}
@Override
public Fragment getItem(int position) {
return PageFragment.newInstance(mDataList.get(position));
}
// isViewFromObject()方法继承
// destroyItem()方法继承
}
上面的代码示例中,getPageWidth()方法返回的是0.6,这意味着ViewPager将不再保留左右两侧的视图。这种情况下,缓存机制将失去优势,ViewPager将不得不在滑动时重新加载视图。
四、页面跳转
PagerAdapter的一个常见使用场景是向左或向右滑动来显示其他页面。但是您还可以使用setCurrentItem()方法来直接跳转到指定的页面。这对于想要定位到特定页面的应用非常有用。
setCurrentItem()方法可以接收一个整数参数,也可以选择是否平滑地滚动视图。
// 跳转到第三个页面
viewPager.setCurrentItem(2, true);
上面的代码示例中,我们调用setCurrentItem()方法并传递2作为参数,这将会跳转到PagerAdapter中第三个页面。