不是真正意义上实现的无限循环,只是设置一个最大值,但是想到用户一般也不可能真正滑到无限大值去,所以这种伪循环也是可以满足需求的。
实现的核心是利用两个viewpager,一个做tab,一个做content。设置一个最大可滑动数,比如1000,这个值不能太大,否则会OOM,内部机制应该是会首先根据你getcount的数初始化一个子项为null的数组。在初始化viewpager的时候选中最中间的项500,再将这个 position转化成实际数据中的position返回View.
对于tab和content中的初始化位置,也有要求,若content中定到的是500的position,那tab中应该是499的位置,这样让tab 中500的位置定位到tab的中间。
1、初始化contentViewpager
private void initContentViewPager() {
PagerAdapter galleryAdapter = new PagerAdapter(
getSupportFragmentManager());
pager.setAdapter(galleryAdapter);
pager.setPageMargin(20);
pager.setOffscreenPageLimit(2);
pager.setCurrentItem(MIDCOUNT, false);
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
tab.setCurrentItem(arg0 - 1, true);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
2、content 中adapter对位置的逻辑处理,当content中Viewpager的位置为500时,应该返回数据中的0位置。
private class PagerAdapter extends FragmentStatePagerAdapter {
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return LOOPCOUNT;
}
@Override
public Fragment getItem(int position) {
int s = 0;
if (position < MIDCOUNT) {
s = strs.length - (Math.abs(position - MIDCOUNT) % strs.length);
} else {
s = position - MIDCOUNT;
}
int pos = s % strs.length;
ContentFragment fragment = ContentFragment.newInstance(strs[pos]);
return fragment;
}
}
3、初始始化Tab
private void initTabViewPager() {
TitleAdapter titleAdapter = new TitleAdapter(
getSupportFragmentManager());
tab.setAdapter(titleAdapter);
tab.setPageMargin((int) (getDisplayWidth() * TABITEMMARGIN));
tab.setOffscreenPageLimit(2);
tab.setCurrentItem(MIDCOUNT - 1, false);
titleAdapter.setOnPageClickListener(new OnPageClickListener() {
@Override
public void onPageClick(int arg0) {
tab.setCurrentItem(arg0 - 1);
}
});
tab.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
pager.setCurrentItem(arg0 + 1, true);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
完整demo地址:https://github.com/hyhe/viewpager-tabbar--infinite-scroll-.git