带Tab的viewpager可循环滑动

不是真正意义上实现的无限循环,只是设置一个最大值,但是想到用户一般也不可能真正滑到无限大值去,所以这种伪循环也是可以满足需求的。

实现的核心是利用两个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

猜你喜欢

转载自wo9shihhy.iteye.com/blog/1841326