天天看點

viewpager實作無限循環滾動幻燈片

一直想做循環滑動幻燈片的效果,類似pptv等的首頁效果十分抱歉,不會整gif動圖~~~

viewpager實作無限循環滾動幻燈片

廢話少說,先上圖看效果:

viewpager實作無限循環滾動幻燈片
viewpager實作無限循環滾動幻燈片
viewpager實作無限循環滾動幻燈片

思路是:設定pageradapter的count為Integer.MAX_VALUE,但實際的item隻有幾個,用取餘的方式取item,在設定adapter時同時設定currentItem為實際item數的N倍(足夠大就好)。這樣就可以左右無縫循環滑動!(畢竟你不可能滑上億次),并且不用擔心記憶體問題,就那幾個玩意~~~

這裡不能用FragmentPagerAdapter或FragmentStatePagerAdapter,因為這兩個的item是fragment,他們有自己的fragment管理機制,要是用,getFragment()傳回同一個fragment(指針一樣)就會報錯,不信就試試~~~

要繼承PagerAdapter,使用view作為item,重寫必要的方法。。。

圖上右下角的訓示器并不是我做的,但我稍微修改了一下,使他使用于我的“無限循環方式”。

廢話太多了,上部分源碼:

這是adapter的:

/**
 * 自定義視圖幻燈片 擴充卡
 * 無限循環
 * @author hezb
 */
public class CustomViewPagerAdapter extends PagerAdapter{

	private final String TAG = "hezb";

	private int realCount = 0;

	private ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
			ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

	private List<View> viewList;
	
	/**
	 * 傳入 自定義 view 的清單
	 */
	public CustomViewPagerAdapter(List<View> viewList) {
		if (viewList == null) {
			Log.e(TAG, "CustomViewPagerAdapter   viewList is null!");
			return;
		}
		realCount = viewList.size();
		this.viewList = viewList;
		for (int i = 0; i < viewList.size(); i++) {
			viewList.get(i).setLayoutParams(lp);
		}
	}

	@Override
	public int getCount() {
		return realCount == 0 ? 0 : Integer.MAX_VALUE;
	}
	/**
	 * @return 實際的 item 數
	 */
	public int getRealCount(){
		return realCount;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == arg1;
	}

	@Override
	public Object instantiateItem(View container, int position) {
		position = position % realCount;
		try {
			((ViewPager) container).addView(viewList.get(position));
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}

		return viewList.get(position);
	}

	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		position = position % realCount;
		try {
			((ViewPager) container).addView(viewList.get(position));
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}

		return viewList.get(position);
	}

	@Override
	public void destroyItem(View container, int position, Object object) {
		((ViewGroup) container).removeView((View) object);
	}
	
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		((ViewGroup) container).removeView((View) object);
	}

}           

唉,表達能力有待提高,直接下工程檔案看看吧!

點選下載下傳!!!

繼續閱讀