ViewPager适配器PagerAdapter重写方法解释

写在前边

  • 现在的时间:2019-07-10
  • 为ViewPager创建配置器时需要重写四个方法,这篇博客解释其中的三个
  • 吐糟一下,之前也看了很多博文,但只简单的提了一下方法的功能,方法在何时调用、方法参数是什么都没有说.

知识预备

    一个ViewPager组件包括很多个子页面,这些子页面都有编号,且是从0开始编号的.

方法详解

import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class ViewPagerAdapter extends PagerAdapter
{
    /**
     * 返回这个ViewPager一共有多少个子页面
     * 可以把所有要展示的页面存到数组或集合中然后返回长度
     * 这个函数在ViewPager对象创建后自动执行 且只会执行一次
     * @return ViewPager 一共有多少子页面
     */
    @Override
    public int getCount()
    {
        return 4;
    }

    /**
     * 这个方法就返回 这两个参数是否相等
     * 具体作用暂不知
     */
    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o)
    {
        return view == o;
    }

    /**
     * ① ViewPager会预加载子页面
     *    在预加载时会自动调用这个方法
     *    虽然一共有几个子页面已经知道了,但这些页面并未创建出来
     *    我们要在这个方法中创建子页面 并且将要展示的内容添加到子页面中
     * ② 当ViewPage第一次加载时会执行这个函数并且执行两次
     *    第一次执行加载第0页面, 第二次执行加载第1页
     * ③ 当从第0页滑动到第1页后 会触发这个函数 预加载第2页
     *    当从第1页滑到第2页后  会触发这个函数 预加载第3页
     *    以类此推
     *
     *    同理,反向滑动也是一样的
     *
     * ④ 这个方法要返回预加载的子页面要显示的组件对象
     * @param container 使用这个适配器的 ViewPager 对象
     * @param position 预加载页面(要创建的页面)的编号(从0开始计)
     * @return 预加载的子页面要显示的组件对象
     */
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position)
    {
        /*---创建一个TextView组件 组件中的文字是传过来的 position---*/
        TextView tv = new TextView(container.getContext());
        tv.setGravity(Gravity.CENTER);
        tv.setTextSize(20);
        tv.setText("第" + position + "页");
        /*----------------------------------------------------*/

        /**
         * ① 调用这个方法来增加一个子页面,参数是页面要展示的组件
         *    实际上是创建一个子页面,在这个方法的作用就是创建ViewPager中的子页面
         * ② 会根据前边有没有已创建的页面 决定这次创建的页面的编号,比如前边已经创建了
         *    两个页面,那个这次创建的页面编号就是2号
         * ③ 这个方法在instantiateItem()方法中只能调用一次多了程序会崩溃
         */
        container.addView(tv);

        return tv;
    }

    /**
     * ① 这个方法用来销毁某个子页面释放资源
     * ② 当刚进入 ViewPager 时 这时已经加载了 0号页与1号页
     *    此时用户处于0号页 用户可能还要滑到1号页 此时哪个页面都不会销毁
     * ② 当用户从0号页滑到1号页 这时已加载的页面时 0、1、2 页
     *    此时用户即可能滑到 0号页 也可能滑到 2号页  所以也不会触发这个函数
     * ③ 当用户从 1号页 滑到 2号页 此时已加载的有  0、1、2、3 页
     *    用户处于 2号页 不可能会直接滑到0号页 所以,此时会触发这个函数来销毁 0号页
     *    通过这个规律 我们就能知道这个方法何时会调用了
     * @param container 使用这个适配器的 ViewPager 对象
     * @param position 要销毁的页面编号
     * @param object 在 instantiateItem()方法 中 return的组件对象会传给它
     */
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object)
    {
        // 根据 object 删除子页面
        // 子页面都是以 k-v 的形式管理的
        // 而 instantiateItem()方法 return的对象就是当时创建的那个子页面的key,所以destroyItem()方法的第三个参数就是页面的key
        // 所以可以根据第三个参数销毁子页面
        container.removeView((View) object);
    }
}

你可能感兴趣的:(Android)