我一直在使用CWAC的EndlessAdapter实现ListView的无限滚动。
我想要为ViewPager实现相同的功能。不幸的是,PageAdapter和ListAdapter没有共同的基类。
如何最好地实现?是否已经存在可以处理此功能的库?
我一直在使用CWAC的EndlessAdapter实现ListView的无限滚动。
我想要为ViewPager实现相同的功能。不幸的是,PageAdapter和ListAdapter没有共同的基类。
如何最好地实现?是否已经存在可以处理此功能的库?
PagerAdapter
实现中。或者,如果希望,尝试创建一个装饰PagerAdapter
,就像EndlessAdapter
装饰常规Adapter
一样。PagerAdapter
设计用于页面为视图或片段,并且在类似FragmentPagerAdapter
的类内部处理片段会有点可怕。ListView
,用户可以快速滑动列表,快速滚动数十或数百行。因此,使用“到达结尾”作为触发器来加载更多数据似乎是合理的。然而,对于ViewPager
,通常需要更长时间才能到达结尾,特别是如果您没有使用PagerTabStrip
或等效物。因此,等待用户一直到达结尾才开始加载其他数据似乎会让用户感到烦恼-您有很多时间去检索更多数据,但没有使用它。ViewPager
注册一个ViewPager.OnPageChangeListener
。当onPageSelected()
被调用,并且您认为自己已接近结尾时,启动一个AsyncTask
(或其他任务)去收集更多数据。然后的问题是,您需要更新PagerAdapter
使用的数据,并在数据更新后调用notifyDataSetChanged()
方法来更新适配器。ViewPager
,你必须将该逻辑放在自定义的PagerAdapter
实现中。 FragmentPagerAdapter
和FragmentStatePagerAdapter
都无法做到这一点,因为它们会为每个页面创建新的片段,导致内存不足。 - CommonsWareFragmentStatePagerAdapter
,到目前为止我还没有达到限制。但我对此不确定,因为状态保存 - 我的视图实际上没有状态,因为每一页都只是反映了日历中选定的一天...我想我应该再次用我的自定义适配器重写它 - 或者只需切换到Views而不是Fragments... - ZordidViewPager
的事情,而不是PagerAdapter
的事情。上次我查看FragmentPagerAdapter
源代码时,并没有删除页面,这也是拥有FragmentStatePagerAdapter
的原因(它会删除页面但保留每个页面状态的捆绑包)。 - CommonsWare@Override
public int getCount() {
return (Integer.MAX_VALUE);
//artificially large value for infinite scrolling
}
public int getRealCount(){
//Do something to return the actual number of objects.
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
int virtualPosition = position % getRealCount();
return instantiateVirtualItem(container, virtualPosition);
}
public Object instantiateVirtualItem(ViewGroup container, final int position) {
//Do the required part here
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
int virtualPosition = position % getRealCount();
destroyVirtualItem(container, virtualPosition, object);
}
public void destroyVirtualItem(ViewGroup container, int position, Object object){
container.removeView((View) object);
}
pager.setOffscreenPageLimit(10); //your choice
pager.setCurrentItem(Integer.MAX_VALUE/2,false);
//pager is the ViewPager object
PS:我已经成功实现了这个。如果您还有疑问,请询问。
你可以通过以下方式“虚假模拟”:
你可能会显示大量页面。使用 FragmentStatePagerAdapter
类:
https://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter.html
实现 getCount
方法,返回 Integer.MAX_VALUE
。
实现 getItemPosition 方法,总是返回 POSITION_NONE
。
根据需要实现 getItem
方法,返回适当的 Fragment。
然后,在承载 ViewPager 的 Activity 启动时,将 ViewPager 的初始位置设置为非常大的数字,例如:viewPager.setCurrentItem(Integer.MAX_VALUE / 2);
。
我自己没有尝试过...,结果可能因人而异! :)