Android ViewPager的工作原理

ViewPager的工作原理(Android)


ViewPager和PagerAdapter在后台为我们完成了很多工作,接下来让我们来深入学习ViewPager的工作原理。

大多数情况下,我们无需了解其内部实现细节。不过如果要自己实现PagerAdapter接口,则需要了解ViewPager-PagerAdapterRecyclerView-Adapter各自关系的异同。

1.什么情况需要自己实现原生PagerAdapter接口?

    当需要ViewPager托管非fragment视图时(如图片这样的常见View对象),就需要实现原生PagerAdapter接口。

2.为什么使用ViewPager而不是RecyclerView?

    由于无法使用现有的Fragment,因此使用RecyclerView需处理大量内部实现工作,Adapter需要我们及时地提供View。然而,决定fragment视图何时创建的是FragmentManager。因此,当RecyclerView要求Adapter提供fragment视图时,我们无法立即创建fragment并提供其视图。

    这就是ViewPager存在的理由。ViewPager使用的是PagerAdapter类,而非原来的Adapter。PagerAdapter要比Adapter复杂的多,因为它要处理更多的视图管理工作。

3.PagerAdapter内部实现:

    PagerAdapter不使用可返回视图的onBindViewHolder(…)方法(Adapter使用该方法),而是使用下列方法:

    public Object instantiateItem(ViewGroup container, int position)——告诉pager adapter创建指定位置的列表项视图,然后将其添加给ViewGroup视图容器

注:该方法并不要求立即创建视图,因此PagerAdapter可自行决定何时创建视图。

    public void destroyItem(ViewGroup container, int position, Object object)——告诉pager adapter销毁已键视图

    public abstract boolean isViewFromObject(View view, Object object)——调用instantiateItem()创建完视图后,ViewPager会在某个时间点看到它。为确定视图所属的对象,ViewPager会调用isViewFromObject()方法

注:这里的Object参数,是instantiateItem()方法返回的对象。

    假设ViewPager调用instantiateItem(ViewGroup,5)方法返回A对象,那么只要传入的View参数是第5个对象的视图,isViewFromObject(View,A)方法就应返回true值,否则返回false值。

    对于ViewPager来说,这是一个复杂的过程,但对于PagerAdapter来说很简单。因为PagerAdapter只要能够创建、销毁视图以及识别视图来自哪个对象即可。这样的要求显然很宽松,因而PagerAdapter能够自由地通过instantiateItem()方法创建并添加新的fragment,然后返回可以跟踪管理的Object(fragment)。

    以下为isViewFromObject()方法的具体实现:

@Override
public boolean isViewFromObject(View view, Object object){
    return ((Fragment)object).getView()==view;
}

    可以看到,每次需要使用ViewPager时,都要覆盖实现PagerAdapter的这些方法,这真是一种磨难。

    幸好,还有FragmentPagerAdapterFragmentStatePagerAdapter可以返回的fragment添加给托管activity,并帮助ViewPager找到fragment的视图并一一对应。真心感谢它们!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章