适用于ViewPager的无限适配器

时间:2013-03-16 07:36:03

标签: android android-viewpager

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

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

最好的方法是什么?是否存在已经处理此问题的库?

3 个答案:

答案 0 :(得分:15)

  

最好的方法是什么?

为您自己的PagerAdapter实现添加“无尽的”逻辑。或者,如果您愿意,可以尝试创建装饰PagerAdapterEndlessAdapter装饰普通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! :)