千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 深入了解PagerAdapter

深入了解PagerAdapter

来源:千锋教育
发布人:xqq
时间: 2023-11-24 19:18:57 1700824737

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

tags: pageradapter
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT