开源项目 无限循环ViewPager InfiniteViewPager 分析(二)

一: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 是 8
endPosition 是 31
currentItem 是 24
3.在  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.
按照假设来,滑到第7个,7<8, return 31+1-8+7%8=31.
也就是当滑到最后一个item是,通过handler 设置setFakeCurrentItem为第一个item
也就是当滑到第一个item是,通过handler 设置setFakeCurrentItem为最后一个item
如此循环往复
item position 的范围也就是 8-31,当超出范围,最大一个是32,就会把currentItem 转成 8,
最小一个是7,就会把currentItem 转成 31,
注:还不明白 为什么 把范围定在 8-31,而不是直接定义在一个更小的范围里,比如0-7,当超出范围是,改变下一个Item的position
 
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PJ佩恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值