不是真正意义上实现的无限循环,只是设置一个最大值,但是想到用户一般也不可能真正滑到无限大值去,所以这种伪循环也是可以满足需求的。
实现的核心是利用两个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