您的位置:

深入了解PagerAdapter

随着移动设备的普及,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中第三个页面。