一:InfiniteViewPager怎么循环的。
假设 现在 viewpager的数据源是 8个,
1.mViewPager.setAdapter()后面的adapter的是InfinitePagerAdapter
在InfinitePagerAdapter中 getCount()返回的是
getItemCount() * InfiniteViewPager.FakePositionHelper.MULTIPLIER;
InfiniteViewPager.FakePositionHelper.MULTIPLIER 是一个常量 ,在sample里是 5 。
也就是说 使用这个的InfinitePagerAdapter,当获取Item个数的时候 ,返回的是 实际数据源list.size的5倍
按照假设来,就是5*8=40.
2.同时 在setAdapter的时候,也设置了 当前了currentItem
setFakeCurrentItem(FakePositionHelper.getRealPositon(InfiniteViewPager.this, 0), false);按照假设来,就是setFakeCurrentItem(24),一共是40个item,实际的判断范围是public static int getStartPosition(InfiniteViewPager viewPager) { int realAdapterSize = viewPager.getAdapterSize() / MULTIPLIER; return realAdapterSize; } public static int getEndPosition(InfiniteViewPager viewPager) { int realAdapterSize = viewPager.getAdapterSize() / MULTIPLIER; return realAdapterSize * (MULTIPLIER - 1) - 1; }按照假设来,就是 8 - 31 ,startPosition 是 8endPosition 是 31currentItem 是 243.在 init(){
public void onPageSelected(int position) {
if getStartPosition(InfiniteViewPager.this) || position > FakePositionHelper.getEndPosition(InfiniteViewPager.this)) { log("position:AA" + position + "->" + FakePositionHelper.getRealPositon(InfiniteViewPager.this, position) + "-return"); mHandler.removeMessages(MSG_SET_PAGE); Message msg = mHandler.obtainMessage(MSG_SET_PAGE); msg.arg1 = position; mHandler.sendMessageDelayed(msg, 500); return; } else { log("position:" + position + "->" + FakePositionHelper.getRealPositon(InfiniteViewPager.this, position)); }
当viewpager 滑动时,一直在对当前currentItem position进行判断,
当 currentItem position 不在 startPosition和endPosition时,进行转换,转成在这个范围内的数
比如,一直滑,滑到第32个position时,超出了范围,就进行转换,
public static int getRealPositon(InfiniteViewPager viewPager, int position) { int realAdapterSize = getRealAdapterSize(viewPager); if (realAdapterSize == 0) return 0; int startPostion = getStartPosition(viewPager); int endPosition = getEndPosition(viewPager); if (position < startPostion) { return endPosition + 1 - realAdapterSize + position % realAdapterSize; } if (position > endPosition) { return startPostion + position % realAdapterSize; } return position; }按照假设来,滑到第32个,32>31, return 8+32%8=8.item position 的范围也就是 8-31,当超出范围,最大一个是32,就会把currentItem 转成 8,按照假设来,滑到第7个,7<8, return 31+1-8+7%8=31.也就是当滑到最后一个item是,通过handler 设置setFakeCurrentItem为第一个item也就是当滑到第一个item是,通过handler 设置setFakeCurrentItem为最后一个item如此循环往复
最小一个是7,就会把currentItem 转成 31,
注:还不明白 为什么 把范围定在 8-31,而不是直接定义在一个更小的范围里,比如0-7,当超出范围是,改变下一个Item的position