Open imliujun opened 7 years ago
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 导致的真实下标错乱。
在无限循环的模式下: 目前只提供了
getNextItem()
方法获取下个Item的下标,如果我想获取上个Item的下标比较麻烦。 1.无法调用getCurrentItemFake()
方法获取真实的下标 2.直接调用getCurrentItem()
方法获取到的是计算后的真实下标,在无限循环模式不能直接减 1 计算上个Item的下标,需要判断当前下标是否为0,然后设置上个I tem 的下标为数据源的 size-1希望开放这些 API 对外访问。