写在前边
- 现在的时间: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);
}
}