alibaba / UltraViewPager

UltraViewPager is an extension for ViewPager to provide multiple features in a single ViewPager.
MIT License
5k stars 680 forks source link

建议将一些API开放访问 #51

Open imliujun opened 7 years ago

imliujun commented 7 years ago

在无限循环的模式下: 目前只提供了 getNextItem() 方法获取下个Item的下标,如果我想获取上个Item的下标比较麻烦。 1.无法调用 getCurrentItemFake() 方法获取真实的下标 2.直接调用 getCurrentItem() 方法获取到的是计算后的真实下标,在无限循环模式不能直接减 1 计算上个Item的下标,需要判断当前下标是否为0,然后设置上个I tem 的下标为数据源的 size-1

希望开放这些 API 对外访问。

MikeAfc commented 7 years ago

getCurrentItemFake() 下一版本会改为public,可否描述下你的使用场景?我看下怎么开放这些接口合适

imliujun commented 7 years ago

具体的场景为:

垂直方向无限循环滚动,刚进入界面的时候需要跳转到指定的Item位置,滑到某个Item时可能需要判断当前Item是否过期,如果过期就移除,自动定位到下一个Item,并且需要判断是上滑还是下滑来确定下一个Item。

目前遇到的一些问题: 因为我不需要下标指示器所以这里直接使用 UltraViewPagerView控件

  1. 刚进入界面需要跳转到指定位置调用 mViewPager.setCurrentItem(index); 会因为设置无限循环导致UltraViewPagerAdapter 回调 finishUpdate 方法又调用了centerListener.center(); 位置居中导致设置失效。 我目前的解决方案是在外部的 adapter 里面重写 finishUpdate 方法,在 centerListener.center(); 执行完后再调用 mViewPager.setCurrentItem(index);,但是外部重写这种方案不够优雅,希望能够提供其他解决方案。最好是内置到 UltraViewPagerAdapter 中去,并且我觉得 UltraViewPagerAdapter 不允许外部访问会造成耦合太高,无法继承进行定制化修改。

  2. 滑到某个Item判断其过期,删除该 Item 后调用外部的 adapter.notifyDataSetChanged() 无效,需要调用 ViewPager.getAdapter().notifyDataSetChanged(); 。这一点在文档中没写,看 issues 有很多人都遇到这个问题。

  3. 因为 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 导致的真实下标错乱。