在南昌APP开发中,ViewPager 和PagerAdapter类在后台为我们完成了很多工作。那么ViewPager是如何工作的呢?在为大家介绍ViewPager的工作原理前,我们需要知道的是:大多情况下,我们无需了解其内部实现细节。不过,如果要自己实现PagerAdapter接口,那就要了解ViewPager-PagerAdapter和Recycler-View-Adapter各自关系的异同了。
那么什么时候需要自己实现PagerAdapter接口呢?如果需要ViewPager托管非fragment视图时,那就需要实现原生PagerAdapter接口。例如,在ViewPager中托管图片这样的常见视图对象时。
说到这里,相信大家又有疑问了,为什么选择使用ViewPager而不是RecyclerView呢?别急,南昌APP制作开发公司小编这就来告诉大家:
那是因为由于无法使用现有的Fragment,在CriminalIntent应用中使用RecyclerView需处理大量内部实现工作。Adapter需要我们及时地提供View。然而,决定fragment视图何时创建的是FragmentManager。因此,当RecyclerView要求Adapter提供fragment视图时,我们无法立即创建fragment并提供其视图。
这就是ViewPager存在的原因。它使用的是PagerAdapter类,而非原来的Adapter。PagerAdapter要比Adapter复杂得多,因为它要处理更多的视图管理工作。以下为它的基本内部实现。
PagerAdapter不使用可返回视图的onBindViewHolder(...)方法,而是使用下列方法:
public Object instantiateItem(ViewGroup container, int position)
public void destroyItem(ViewGroup container, int position, Object object)
public abstract boolean isViewFromObject(View view, Object object)
PagerAdapter.instantiateItem(ViewGroup, int)方法告诉pager adapter创建指定位置的列表项视图,然后将其添加给ViewGroup视图容器,而destroyItem(ViewGroup, int,Object)方法则告诉pager adapter销毁已建视图。注意,instantiateItem(ViewGroup, int)方法并不要求立即创建视图。因此,PagerAdapter可自行决定何时创建视图。
视图创建完成后,ViewPager会在某个时间点注意到它。为确定该视图所属的对象,ViewPager会调用isViewFromObject(View, Object) 方法。这里, Object 参数是instantiateItem(ViewGroup,int)方法返回的对象。因此,假设ViewPager调用instantiateItem(ViewGroup, 5)方法返回一个A对象,那么只要传入的View参数是第5个对象的视图,isViewFromObject(View, A)方法就应返回true值,否则返回false值。
对ViewPager来说,这是一个复杂的过程,但对于PagerAdapter来说,这算不上什么。因为PagerAdapter只要能够创建、销毁视图以及识别视图来自哪个对象即可。这样的要求显然很宽松,因而PagerAdapter能够比较自由地通过instantiateItem(ViewGroup, int)方法创建并添加新的fragment,然后返回可以跟踪管理的Object(fragment)。以下为isViewFromObject(View, Object)方法的具体实现:
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment)object).getView() == view;
}
可以看到,每次需要使用ViewPager时,都要覆盖实现PagerAdapter的这些方法,这真是一种磨难。幸好我们有FragmentPagerAdapter和FragmentStatePagerAdapter便利类,以至于我们不会那么麻烦!
以上便是南昌APP开发公司小编为大家介绍的关于APP开发中ViewPager 的工作原理,如果想进一步了解这方面的知识的朋友,欢迎大家继续关注百恒网络官网动态,我们将定期为您更新技术文章。如有需要APP开发、网站建设等方面的服务,可随时来电和我们联系,本公司随时为您效劳。