11

我一直在使用CWAC 的 EndlessAdapter在 ListViews 上实现无限滚动。

我想完成 ViewPager 的等效操作。不幸的是,PageAdapter 和 ListAdapter 不共享相同的公共基类。

解决这个问题的最佳方法是什么?是否存在已经处理此问题的库?

4

3 回答 3

15

解决这个问题的最佳方法是什么?

将“无尽”逻辑添加到您自己的PagerAdapter. 或者,如果您愿意,可以尝试创建一个 decorating PagerAdapter,以EndlessAdapter装饰常规的方式Adapter

后者可能会很棘手,因为它PagerAdapter是为将页面设计为视图或片段而设计的,并且类内部的片段处理FragmentPagerAdapter有点可怕。

是否存在已经处理此问题的库?

没有我知道的。

主要是因为用例似乎不那么引人注目。使用ListView,用户可以快速翻阅列表,快速滚动数十或数百行。因此,使用“we got to end”作为加载更多数据的触发器似乎是合理的。但是,使用 a ViewPager,通常需要更长的时间才能完成,特别是如果您不使用PagerTabStrip或等效项。因此,等到用户一直到最后才开始加载额外的数据似乎对用户来说很烦人——你一直有时间去检索更多的数据,但没有使用它。

因此,另一种方法是让您在ViewPager.OnPageChangeListener您的ViewPager. 当onPageSelected(),并且您认为自己接近尾声时,开始AsyncTask(或其他)去收集更多数据。那么问题是,一旦数据更新,您将需要更新PagerAdapter和调用notifyDataSetChanged()该适配器使用的数据。

于 2013-03-20T12:11:34.200 回答
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:我已经成功实现了这一点。问你是否还有疑问。

于 2013-03-22T07:41:52.513 回答
5

也许您可以按如下方式“伪造”:

您可能会显示大量的页面。使用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!:)

于 2013-03-19T22:39:08.767 回答