PagerAdapter源码解析

1.viewPager.setAdapter(PagerAdapter);
在setAdapter中会调用pagerAdapter.startUpdate(this);把viewpager传入到pagerAdapter中;

2.pagerAdapter中的方法说明:
子类继承PagerAdapter需要实现方法说明

Object instantiateItem(ViewGroup container, int position)

要显示的页面或需要缓存的页面,会调用这个方法进行布局的初始化。
这个方法是ViewPager需要加载某个页面时调用,container就是ViewPager自己,position页面索引;
我们需要实现的是添加一个view到container中,然后返回一个跟这个view能够关联起来的对象,这个对象可以是view自身,也可以是其他对象(比如FragmentPagerAdapter返回的就是一个Fragment),关键是在isViewFromObject能够将view和这个object关联起来;

void destroyItem(ViewGroup container, int position, Object object)

当ViewPager需要销毁一个页面时调用,我们需要将position对应的view从container中移除。
这时参数除了position就只有object,其实就是上面instantiateItem方法返回的对象,这时要通过object找到对应的View,然后将其移除掉,如果你的instantiateItem方法返回的就是View,这里就直接强转成View移除即可:container.removeView((View) object);如果不是,一般会自己创建一个List缓存view列表,然后根据position从List中找到对应的view移除;(当然你也可以不移除,内存泄漏)。
FragmentPagerAdapter的实现是:mCurTransaction.detach((Fragment)object),其实也就是将fragemnt的view从container中移除

isViewFromObject(View view, Object object)

这个方法用于判断是否由对象生成界面,官方建议直接返回 return view == object;。
从名称理解起来像是判断view是否来自object,更进一步解释应该是上面instantiateItem方法中,向container中添加的view和方法返回的对象两者之间一对一的关系;因为在ViewPager内部有个方法叫infoForChild,
这个方法是通过view去找到对应页面信息缓存类ItemInfo(内部调用了isViewFromObject),如果找不到,说明这个view是个野孩子,ViewPager会认为不是Adapter提供的View,所以这个View不会显示出来;
总结一下:isViewFromObject 方法是让view和object(内部为ItemInfo)一一对应起来;

int getItemPosition(Object object)

判断当前object对应的View是否需要更新,在调用notifyDataSetChanged时会间接触发该方法,
如果返回POSITION_UNCHANGED表示该页面不需要更新,如果返回POSITION_NONE则表示该页面无效了,需要销毁并触发destroyItem方法(并且会调用instantiateItem重新初始化这个页面);

finishUpdate(ViewGroup):

当页面的显示变化完成式调用。在这里,你一定保证所有的页面从容器中合理的添加或移除掉。

setPrimaryItem(ViewGroup, int, Object):

被ViewPager调用来通知adapter此时那个item应该被认为是主要的页面,这个页面将在当前页面展示给用户。正是因为这个方法,才有在ViewPager中实现Fragment懒加载的机制。

https://www.cnblogs.com/yc211/p/11272428.html

setPrimaryItem viewpager实现懒加载

https://www.kaelli.com/30.html

你可能感兴趣的:(PagerAdapter源码解析)