建议将一些API开放访问
在无限循环的模式下:
目前只提供了 getNextItem() 方法获取下个Item的下标,如果我想获取上个Item的下标比较麻烦。
1.无法调用 getCurrentItemFake() 方法获取真实的下标
2.直接调用 getCurrentItem() 方法获取到的是计算后的真实下标,在无限循环模式不能直接减 1 计算上个Item的下标,需要判断当前下标是否为0,然后设置上个I tem 的下标为数据源的 size-1
希望开放这些 API 对外访问。
getCurrentItemFake() 下一版本会改为public,可否描述下你的使用场景?我看下怎么开放这些接口合适
具体的场景为:
垂直方向无限循环滚动,刚进入界面的时候需要跳转到指定的Item位置,滑到某个Item时可能需要判断当前Item是否过期,如果过期就移除,自动定位到下一个Item,并且需要判断是上滑还是下滑来确定下一个Item。
目前遇到的一些问题:
因为我不需要下标指示器所以这里直接使用 UltraViewPagerView控件
-
刚进入界面需要跳转到指定位置调用
mViewPager.setCurrentItem(index);会因为设置无限循环导致UltraViewPagerAdapter回调finishUpdate方法又调用了centerListener.center();位置居中导致设置失效。 我目前的解决方案是在外部的 adapter 里面重写finishUpdate方法,在centerListener.center();执行完后再调用mViewPager.setCurrentItem(index);,但是外部重写这种方案不够优雅,希望能够提供其他解决方案。最好是内置到UltraViewPagerAdapter中去,并且我觉得UltraViewPagerAdapter不允许外部访问会造成耦合太高,无法继承进行定制化修改。 -
滑到某个Item判断其过期,删除该 Item 后调用外部的
adapter.notifyDataSetChanged()无效,需要调用ViewPager.getAdapter().notifyDataSetChanged();。这一点在文档中没写,看 issues 有很多人都遇到这个问题。 -
因为 ViewPager 执行
notifyDataSetChanged()进行刷新需要根据adapter.getItemPosition()方法判断该Item需不需要更新,当getItemPosition方法返回POSITION_NONE时,假设我当前是向下滑动然后 remove 下标为 4 的数据,刷新后我希望他自动定位到下一个数据,因为 4 被移除了,下一个数据的下标就变成了 4,那么只要当前的下标不改变就OK了,然而在无限循环状态下,假设数据源的长度为 10,UltraViewPagerAdapter 计算出来的长度为count = adapter.getCount() * infiniteRatio;也就是 4000,定位到中间位置 2000,然后我手动滑到 2004,也就是真实下标 4 的位置,这个时候发现数据过期进行移除,再执行notifyDataSetChanged(),当前还在 2004 的位置,但是因为数据源长度变化了,对应的真实下标已经变成了 6。 当然其他的一些循环滑动情况,比如往下滑到最后一个 Item ,进行删除自动定位到下一个 Item 应该是第一个 Item;往上滑到第一个 Item,进行删除应该自动定位到最后一个 Item。 删除Item后的位置定位可以通过在finishUpdate回调执行setCurrentItem,或者使用 handle 延迟执行setCurrentItem,手动将 ViewPager 的位置改变到真实下标对应的位置。 但是在外部写这么一堆代码去做这些事情,我觉得应该在框架内部实现这些逻辑,毕竟这是无限循环状态下移除 Item 导致的真实下标错乱。