我一直在使用CWAC's EndlessAdapter在ListViews上实现无限滚动。
我想完成ViewPager的等效功能。不幸的是,PageAdapter和ListAdapter不共享相同的公共基类。
最好的方法是什么?是否存在已经处理此问题的库?
答案 0 :(得分:15)
最好的方法是什么?
为您自己的PagerAdapter
实现添加“无尽的”逻辑。或者,如果您愿意,可以尝试创建装饰PagerAdapter
,EndlessAdapter
装饰普通Adapter
的方式。
后者可能很棘手,因为PagerAdapter
是针对视图或片段设计的,而像FragmentPagerAdapter
这样的类内部的片段处理有点可怕。
是否存在已经处理此问题的库?
我不知道。
主要是因为用例似乎并不引人注目。使用ListView
,用户可以快速浏览列表,滚动数十行或数百行。因此,使用“我们到达终点”作为加载更多数据的触发器似乎是合理的。但是,如果使用ViewPager
,通常需要花费更长的时间才能结束,特别是如果您没有使用PagerTabStrip
或等效内容。因此,等到用户一直到最后开始加载其他数据似乎对用户来说很烦人 - 你有这么多时间去检索更多数据,但没有使用它。
因此,您可以选择在ViewPager.OnPageChangeListener
注册ViewPager
。当onPageSelected()
,并且您认为自己接近结束时,启动AsyncTask
(或其他)以收集更多数据。然后,您需要更新PagerAdapter
使用的数据,并在数据更新后调用该适配器上的notifyDataSetChanged()
。
答案 1 :(得分:6)
@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:我已经成功实现了这一点。问你是否还有疑问。
答案 2 :(得分:5)
也许你可以“伪装”如下:
您可能会显示一个huuuuge页数。使用FragmentStatePagerAdapter
类:
https://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter.html
通过返回getCount
实施Integer.MAX_VALUE
方法
通过始终返回POSITION_NONE
来实现getItemPosition方法
根据需要实现getItem
方法,返回相应的片段。
然后,当承载ViewPager的Activity启动时,将ViewPager的初始位置设置为一个非常大的数字,例如viewPager.setCurrentItem(Integer.MAX_VALUE / 2);
。
我自己没试过......,YMMV! :)