我一直在使用CWAC 的 EndlessAdapter在 ListViews 上实现无限滚动。
我想完成 ViewPager 的等效操作。不幸的是,PageAdapter 和 ListAdapter 不共享相同的公共基类。
解决这个问题的最佳方法是什么?是否存在已经处理此问题的库?
我一直在使用CWAC 的 EndlessAdapter在 ListViews 上实现无限滚动。
我想完成 ViewPager 的等效操作。不幸的是,PageAdapter 和 ListAdapter 不共享相同的公共基类。
解决这个问题的最佳方法是什么?是否存在已经处理此问题的库?
解决这个问题的最佳方法是什么?
将“无尽”逻辑添加到您自己的PagerAdapter
. 或者,如果您愿意,可以尝试创建一个 decorating PagerAdapter
,以EndlessAdapter
装饰常规的方式Adapter
。
后者可能会很棘手,因为它PagerAdapter
是为将页面设计为视图或片段而设计的,并且类内部的片段处理FragmentPagerAdapter
有点可怕。
是否存在已经处理此问题的库?
没有我知道的。
主要是因为用例似乎不那么引人注目。使用ListView
,用户可以快速翻阅列表,快速滚动数十或数百行。因此,使用“we got to end”作为加载更多数据的触发器似乎是合理的。但是,使用 a ViewPager
,通常需要更长的时间才能完成,特别是如果您不使用PagerTabStrip
或等效项。因此,等到用户一直到最后才开始加载额外的数据似乎对用户来说很烦人——你一直有时间去检索更多的数据,但没有使用它。
因此,另一种方法是让您在ViewPager.OnPageChangeListener
您的ViewPager
. 当onPageSelected()
,并且您认为自己接近尾声时,开始AsyncTask
(或其他)去收集更多数据。那么问题是,一旦数据更新,您将需要更新PagerAdapter
和调用notifyDataSetChanged()
该适配器使用的数据。
@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);
.
我自己没有试过这个......,YMMV!:)