自定義ScrollView嵌套Pageview和GridView(ListView)的相關問題

問題一:

           返回該界面,頁面不在頁首。

           解決辦法:

                       

     gridView.setFocusable(false); //對Gridview設置(listview)
     scrollView.smoothScrollTo(0,20);  //顯示頁首


問題二:

             pageView水平滑動和scrollView垂直滑動的衝突,以及點擊事件的衝突。

              解決辦法:

                      1.在pageView裏屏蔽組件監聽,使在LinearLayout裏面得監聽無效,這樣滑動的衝突解決了

                      2.在pageView寫一個監聽的接口留給LinearLayout實現,這裏的監聽自我感覺不是一個好的解決方法,在onTouch方法裏寫的監聽。

                      3.由於是頁面的activity(frament)實現監聽,LinearLayout繼續講監聽拋出。

                      4. 在使用LinearLayout的頁面activity(frament)裏實現監聽的方法。

 

由於樓主也是初入android大門沒多久,所以解決辦法存在很多不足和侷限性,希望各路大神提出更好的解決辦法。



下面貼代碼:

IndexFragment.java

package com.pactera.ishop;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.Dialog;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.webkit.WebView.FindListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.pactera.ResideMenu.ResideMenu;
import com.pactera.bean.MerchantsInfo;
import com.pactera.bean.StoreInfo;
import com.pactera.common.Common;
import com.pactera.imagecycleview.ADInfo;
import com.pactera.imagecycleview.CycleViewPager;
import com.pactera.imagecycleview.ImageCycleView;
import com.pactera.imagecycleview.ImageCycleView.ImageCycleViewListener;
import com.pactera.imagecycleview.MyApplication;
import com.pactera.util.CustomScrollView;
import com.pactera.util.CustomScrollView.OnLoadListener;
import com.pactera.util.CustomScrollView.OnRefreshListener;
import com.pactera.util.DialogUtil;
import com.pactera.util.HttpUtils;
import com.pactera.util.HttpUtils.NetException;
import com.pactera.util.MyGridView;
import com.pactera.util.NetConnectivityManager;
import com.pactera.util.PositionUtil;

public class IndexFragment extends Fragment implements OnClickListener {
	 
    private int startIndex = 1;  
    
    private List<JSONObject> list_array = new ArrayList<JSONObject>(); 
    
	private MyApplication my_application;
	
	private View messageLayout;
	
	private ImageCycleView mAdView;
	
	private LinearLayout left_ll;
	
	private ImageView catgory;
	
	private MyGridView gridView;
	
	private Dialog loading;
	
	private int totalpage = 0;
	
	private static String store_name;
	
	private gAdapter adapter;

	private static TextView cityName;
	private ImageView menu;
	
	private CustomScrollView scrollView = null;

	private ArrayList<ADInfo> infos = new ArrayList<ADInfo>();

	private String[] imageUrls = { Common.URL_Logo1, Common.URL_Logo2,
			Common.URL_Logo3, Common.URL_Logo4, Common.URL_Logo5 };

	private Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			switch (msg.what) {
			case 1:
				CustomScrollView.flag = 1;
				break;
			case 2:
					adapter = new gAdapter(getActivity());
					gridView.setAdapter(adapter);
					gridView.setOnItemClickListener(new OnItemClickListener() {
						@Override
						public void onItemClick(AdapterView<?> arg0, View v,
								int arg2, long arg3) {
							JSONObject merchant;
							try {
								merchant = list_array.get(arg2);
								Intent i = new Intent();
								String url = merchant.get("imgpath").toString();
								i.putExtra("url", url);
								i.putExtra("mId", merchant.get("mer_id").toString());
								i.putExtra("price", merchant.get("price")
										.toString());
								i.setClass(getActivity(),
										MerchantDetailActivity.class);
								startActivity(i);
							} catch (JSONException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}

						}
					});
					loading.hide();	
				break;
			case 3:
				loading.hide();
				break;

			default:
				break;
			}
		}

	};

	
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		messageLayout = inflater.inflate(R.layout.index_layout, container,
				false);
		scrollView = (CustomScrollView) messageLayout.findViewById(R.id.custom_scroll_view);
		my_application = (MyApplication) getActivity().getApplication();
		
		mAdView =(ImageCycleView) messageLayout.findViewById(R.id.ad_view);
		
		gridView =(MyGridView) messageLayout.findViewById(R.id.index_gview);
		gridView.setFocusable(false);
		for (int i = 0; i < imageUrls.length; i++) {
			ADInfo info = new ADInfo();
			info.setUrl(imageUrls[i]);
			info.setContent(String.valueOf(i));
			infos.add(info);
		}
		scrollView.smoothScrollTo(0,20);
		//下拉
		scrollView.setOnRefreshListener(new OnRefreshListener() {
			public void onRefresh() {
				new AsyncTask<Void, Void, Void>() {
					protected Void doInBackground(Void... params) {
						try {
							Thread.sleep(1500);
						} catch (Exception e) {
							e.printStackTrace();
						}
						return null;
					}

					@Override
					protected void onPostExecute(Void result) {
						startIndex = 1;
						CustomScrollView.flag = 0;
						list_array.clear();
						setData(startIndex);
						scrollView.onRefreshComplete();
					}

				}.execute();
			}
		});

		//上拉
		scrollView.setOnLoadListener(new OnLoadListener() {
			public void onLoad() {
				new AsyncTask<Void, Void, Void>() {
					protected Void doInBackground(Void... params) {
						try {
							Thread.sleep(1500);
						} catch (Exception e) {
							e.printStackTrace();
						}
						return null;
					}

					@Override
					protected void onPostExecute(Void result) {
						setData(++startIndex);
						scrollView.onLoadComplete();
					}

				}.execute();
			}
		});
		
		mAdView.setImageResources(infos, mAdCycleViewListener);
		catgory = (ImageView) messageLayout.findViewById(R.id.catgory);
		menu = (ImageView) messageLayout.findViewById(R.id.menu);	
		
		menu.setOnClickListener(this);
		loading = DialogUtil.createLoadingDialog(this.getActivity(), "數據加載中");
		loading.show();

		setData(startIndex);

		return messageLayout;
	}

	private void setData(final int int_currentPage) {
		StoreInfo s = (StoreInfo)my_application.getStore();
		if (s == null) {
			s = new StoreInfo();
		}
		//cityName.setText(PositionUtil.CITY + "\n" + s.getStoreName());
		new Thread() {
			@Override
			public void run() {
				Map<String, String> params = new HashMap<String, String>();
				if (NetConnectivityManager.getActiveNetwork(getActivity())) {

					String res = new String();
					params.put("currentPage",String.valueOf(int_currentPage));
					try {
						//http://221.122.78.102:8899/ishop/ePlatform/mobile/queryIndexMerchants.do?currentPage=2
						res = HttpUtils.sendPostMessage(params,
								Common.URL_indexReques);
						System.out.println("res" + res);

						JSONObject json = new JSONObject(res);
						
						int now_page = Integer.parseInt(json.getString("currentPage"));
						
						totalpage =  Integer.parseInt(json.getString("totalPage"));
						if(now_page <= totalpage){
							if(now_page == totalpage)
								CustomScrollView.flag = 1;
							if (json.get("result").equals("0")) {
								JSONArray list_rusult = new JSONArray();
								list_rusult = json.getJSONArray("data");
								Message msg = new Message();
								msg.what = 2;
						        for (int i = 0; i < list_rusult.length(); i++) {  
						            list_array.add(list_rusult.getJSONObject(i));  
						        }  
								mHandler.sendMessage(msg);
							}
							
						}
							
							
						

					} catch (JSONException e) {
						// TODO Auto-generated catch block
						Log.e("jsonException", res);
						mHandler.sendEmptyMessage(1);
						e.printStackTrace();

						mHandler.sendEmptyMessage(1);
					} catch (NetException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();

						System.out.println(e.errorCode);
						mHandler.sendEmptyMessage(1);
					}
				} else {

					mHandler.sendEmptyMessage(1);
				}

			}
		}.start();
	}

	   
	private ImageCycleViewListener mAdCycleViewListener = new ImageCycleViewListener() {

		@Override
		public void onImageClick(int ImageIndex,ADInfo info, int position, View view) {
			Toast.makeText(getActivity(), "imageindex---->" + ImageIndex, Toast.LENGTH_SHORT).show();
		}

		@Override
		public void displayImage(String imageURL, ImageView imageView) {
			ImageLoader.getInstance().displayImage(imageURL, imageView);
		}
	};

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.menu:

//			Intent intent = new Intent();
//			intent.setClass(getActivity(), StoreActivity.class);
//			startActivity(intent);
			MainActivity.resideMenu.openMenu(ResideMenu.DIRECTION_LEFT);
			break;
			
		case R.id.catgory:
//			Intent intent = new Intent();		
//			intent.setClass(getActivity(), MerchantSubActivity.class);
//			startActivity(intent);
			break;

		default:
			break;
		}
	}

	class gAdapter extends BaseAdapter {
		private LayoutInflater layoutInflater;
		private Context context;
		

		public gAdapter(Context context) {
			super();
			this.context = context;
			layoutInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			return  list_array == null ? 0 :  list_array.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			try {
				return  list_array.get(position);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			ViewHolder holder;  
			if (convertView == null) {
				holder = new ViewHolder(); 
				convertView = layoutInflater.inflate(R.layout.index_grid, null);
				holder.imageView = (ImageView) convertView
						.findViewById(R.id.grid_iv);
				holder.textView = (TextView) convertView
						.findViewById(R.id.grid_tv);
				holder.price = (TextView) convertView
						.findViewById(R.id.grid_price);
				holder.promotions = (TextView) convertView
						.findViewById(R.id.grid_promotions);
				holder.market_price = (TextView) convertView
						.findViewById(R.id.grid_market_price);
				convertView.setTag(holder); 
			}else{
				 holder = (ViewHolder) convertView.getTag(); 
			}
			JSONObject data;
			try {
				data =  list_array.get(position);
				MerchantsInfo merchant = new MerchantsInfo(data);
				String url = Common.img_ip + merchant.getImgpath();
				ImageLoader.getInstance().displayImage(url, holder.imageView);
				holder.textView.setText(merchant.getMer_name());
				holder.price.setText("¥" + merchant.getPrice() + "元");
				holder.promotions.setText(merchant.getPromotions());
				holder.market_price.setText("市場價: ¥" + merchant.getMarket_price());
				holder.market_price.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return convertView;
		}
	}

    static class ViewHolder {  
		public ImageView imageView ;
		public TextView textView;
		public TextView price ;
		public TextView promotions;
		public TextView market_price;
    }
	
	@Override
	public void onDestroyView() {
		// TODO Auto-generated method stub
		loading.dismiss();
		super.onDestroyView();
	}

}


Linearlayout.java


package com.pactera.imagecycleview;

import java.util.ArrayList;

import com.pactera.imagecycleview.CycleViewPager.OnCycleClickListener;
import com.pactera.ishop.R;

import android.content.Context;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

public class ImageCycleView extends LinearLayout {

	/**
	 * 上下文
	 */
	private Context mContext;
   public static boolean isMove=false;
	/**
	 * 圖片輪播視圖
	 */
	private CycleViewPager mBannerPager = null;

	/**
	 * 滾動圖片視圖適配器
	 */
	private ImageCycleAdapter mAdvAdapter;

	/**
	 * 圖片輪播指示器控件
	 */
	private ViewGroup mGroup;

	/**
	 * 圖片輪播指示器-個圖
	 */
	private ImageView mImageView = null;

	/**
	 * 滾動圖片指示器-視圖列表
	 */
	private ImageView[] mImageViews = null;

	/**
	 * 圖片滾動當前圖片下標
	 */
	private int mImageIndex = 1;

	/**
	 * 手機密度
	 */
	private float mScale;


	
	public static int sImageIndex = 1;
	public ImageCycleView(Context context) {
		super(context);
	}


	public ImageCycleView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		mScale = context.getResources().getDisplayMetrics().density;
		LayoutInflater.from(context).inflate(R.layout.view_banner_content, this);
		mBannerPager = (CycleViewPager) findViewById(R.id.pager_banner);
		mBannerPager.setOnPageChangeListener(new GuidePageChangeListener());
		mBannerPager.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
					case MotionEvent.ACTION_UP:
						// 開始圖片滾動
						startImageTimerTask();
						isMove=false;
						break;
					case MotionEvent.ACTION_DOWN:
						isMove=true;
						break;
					case MotionEvent.ACTION_MOVE:
						isMove=true;
						break;
					default:
						// 停止圖片滾動
						stopImageTimerTask();
						break;
				}
				return false;
			}
		});
		// 滾動圖片右下指示器視圖
		mGroup = (ViewGroup) findViewById(R.id.viewGroup);
	}

	/**
	 * 裝填圖片數據
	 * 
	 */
	public void setImageResources(ArrayList<ADInfo> infoList, ImageCycleViewListener imageCycleViewListener) {
		// 清除所有子視圖
		mGroup.removeAllViews();
		// 圖片廣告數量
		final int imageCount = infoList.size();
		mImageViews = new ImageView[imageCount];
		for (int i = 0; i < imageCount; i++) {
			mImageView = new ImageView(mContext);
			int imageParams = (int) (mScale * 20 + 0.5f);// XP與DP轉換,適應不同分辨率
			int imagePadding = (int) (mScale * 5 + 0.5f);
			LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
			layout.setMargins(3, 0, 3, 0);
			mImageView.setLayoutParams(layout);
			//mImageView.setPadding(imagePadding, imagePadding, imagePadding, imagePadding);
			mImageViews[i] = mImageView;
			if (i == 0) {
				mImageViews[i].setBackgroundResource(R.drawable.icon_point_pre);
			} else {
				mImageViews[i].setBackgroundResource(R.drawable.icon_point);
			}
			mGroup.addView(mImageViews[i]);
		}
		mAdvAdapter = new ImageCycleAdapter(mContext, infoList, imageCycleViewListener,mBannerPager);
		mBannerPager.setAdapter(mAdvAdapter);
		startImageTimerTask();
	}

	/**
	 * 開始輪播(手動控制自動輪播與否,便於資源控制)
	 */
	public void startImageCycle() {
		startImageTimerTask();
	}

	/**
	 * 暫停輪播——用於節省資源
	 */
	public void pushImageCycle() {
		stopImageTimerTask();
	}

	/**
	 * 開始圖片滾動任務
	 */
	private void startImageTimerTask() {
		stopImageTimerTask();
		// 圖片每3秒滾動一次
		mHandler.postDelayed(mImageTimerTask, 3000);
	}

	/**
	 * 停止圖片滾動任務
	 */
	private void stopImageTimerTask() {
		mHandler.removeCallbacks(mImageTimerTask);
	}

	private Handler mHandler = new Handler();

	/**
	 * 圖片自動輪播Task
	 */
	private Runnable mImageTimerTask = new Runnable() {

		@Override
		public void run() {
			if (mImageViews != null) {
				// 下標等於圖片列表長度說明已滾動到最後一張圖片,重置下標
				if ((++mImageIndex) == mImageViews.length + 1) {
					mImageIndex = 1;
				}
				mBannerPager.setCurrentItem(mImageIndex);
				sImageIndex = mImageIndex;
			}
		}
	};

	/**
	 * 輪播監聽器
	 * 
	 */
	private final class GuidePageChangeListener implements OnPageChangeListener {

		@Override
		public void onPageScrollStateChanged(int state) {
			if (state == ViewPager.SCROLL_STATE_IDLE)
				startImageTimerTask(); // 開始下次計時
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
		}

		@Override
		public void onPageSelected(int index) {
			
			if (index == 0 || index == mImageViews.length + 1) {
				return;
			}
			// 圖片滾動指示器背景
			mImageIndex = index;
			sImageIndex = index;
			index -= 1;
			mImageViews[index].setBackgroundResource(R.drawable.icon_point_pre);
			for (int i = 0; i < mImageViews.length; i++) {
				if (index != i) {
					mImageViews[i].setBackgroundResource(R.drawable.icon_point);
				}
			}

		}

	}

	private class ImageCycleAdapter extends PagerAdapter {

		/**
		 * 圖片視圖緩存列表
		 */
		private ArrayList<ImageView> mImageViewCacheList;

		/**
		 * 圖片資源列表
		 */
		private ArrayList<ADInfo> mAdList = new ArrayList<ADInfo>();

		/**
		 * 圖片點擊監聽器
		 */
		private ImageCycleViewListener mImageCycleViewListener;

		private CycleViewPager mBannerPager;
		private Context mContext;

		public ImageCycleAdapter(Context context, ArrayList<ADInfo> adList, ImageCycleViewListener imageCycleViewListener,CycleViewPager bannerPager) {
			mContext = context;
			mAdList = adList;
			mImageCycleViewListener = imageCycleViewListener;
			mImageViewCacheList = new ArrayList<ImageView>();
			this.mBannerPager = bannerPager;
		}
		
		@Override
		public int getCount() {
			return mAdList.size();
		}

		@Override
		public boolean isViewFromObject(View view, Object obj) {
			return view == obj;
		}

		@Override
		public Object instantiateItem(ViewGroup container, final int position) {
		    String imageUrl = mAdList.get(position).getUrl();
			ImageView imageView = null;
			if (mImageViewCacheList.isEmpty()) {
				imageView = new ImageView(mContext);
				imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
				imageView.setScaleType(ImageView.ScaleType.FIT_XY);
			} else {
				imageView = mImageViewCacheList.remove(0);
			}
			// 設置圖片點擊監聽
			imageView.setTag(imageUrl);
			mBannerPager.setCycleClickListener(new onClickofView(imageView,mImageCycleViewListener,mAdList,position));
			container.addView(imageView);
			mImageCycleViewListener.displayImage(imageUrl, imageView);
			return imageView;
		}


		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			ImageView view = (ImageView) object;
			container.removeView(view);
			mImageViewCacheList.add(view);
		}

	}

	/**
	 * 輪播監聽事件
	 */
	public static interface ImageCycleViewListener {
          //加載
		public void displayImage(String imageURL, ImageView imageView);
		 // 單擊
		public void onImageClick(int ImageIndex ,ADInfo info, int postion, View view);
	}

	public class onClickofView implements CycleViewPager.OnCycleClickListener{
		
		private ImageCycleViewListener mImageCycleViewListener;
		private ArrayList<ADInfo> mAdList;
		private int position;
        
        public onClickofView(ImageView imageView,ImageCycleViewListener mImageCycleViewListener,ArrayList<ADInfo> mAdList,int position) {
			// TODO Auto-generated constructor stub
        	this.mImageCycleViewListener = mImageCycleViewListener;
        	this.position = position;
        	this.mAdList = mAdList;
		}
		@Override
		public void onClick(View v, int ImageIndex) {			
			mImageCycleViewListener.onImageClick(ImageIndex,mAdList.get(position),position, v);
		}
		
	}


}



pageView.java


package com.pactera.imagecycleview;

import java.util.Date;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.DataSetObserver;
import android.graphics.PointF;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

public class CycleViewPager extends ViewPager {
    PointF downP = new PointF();
    PointF curP = new PointF();
	long starttime = 0;
	long endtime = 0;
	
	private OnCycleClickListener clickListener;
	
	public interface OnCycleClickListener{
		
		public void onClick(View v, int ImageIndex);
	}
	
	public void setCycleClickListener(OnCycleClickListener clickListener){
		this.clickListener = clickListener;
	}
	
	@Override
	public boolean onInterceptTouchEvent(MotionEvent event) {
		return true;
	}

	@SuppressLint("ClickableViewAccessibility")
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		curP.x = ev.getX();
		curP.y = ev.getY();
		Date dt= new Date();

		if (ev.getAction() == MotionEvent.ACTION_DOWN) {
			downP.x = ev.getX();
			downP.y = ev.getY();
			starttime = dt.getTime();
			getParent().requestDisallowInterceptTouchEvent(true);
		}
		if (ev.getAction() == MotionEvent.ACTION_MOVE) {
			float distanceX = curP.x - downP.x;
			float distanceY = curP.y - downP.y;
			if (Math.abs(distanceX) > Math.abs(distanceY)) {
				getParent().requestDisallowInterceptTouchEvent(true);
			} else {
				getParent().requestDisallowInterceptTouchEvent(false);
			}
		}
		
		if(ev.getAction() == MotionEvent.ACTION_UP){
			float distanceX = curP.x - downP.x;
			float distanceY = curP.y - downP.y;
			endtime = dt.getTime();
			if((endtime-starttime) < 500 && Math.abs(distanceX) < 4 && Math.abs(distanceY) < 4 ){
				clickListener.onClick(this,ImageCycleView.sImageIndex);
			}
		}
		

		return super.onTouchEvent(ev);
	}


	
	private InnerPagerAdapter mAdapter;

	public CycleViewPager(Context context) {
		super(context);
		setOnPageChangeListener(null);
	}

	public CycleViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		setOnPageChangeListener(null);
	}

	@Override
	public void setAdapter(PagerAdapter arg0) {
		mAdapter = new InnerPagerAdapter(arg0);
		super.setAdapter(mAdapter);
		setCurrentItem(1);
	}

	@Override
	public void setOnPageChangeListener(OnPageChangeListener listener) {
		super.setOnPageChangeListener(new InnerOnPageChangeListener(listener));
	}

	private class InnerOnPageChangeListener implements OnPageChangeListener {

		private OnPageChangeListener listener;
		private int position;

		public InnerOnPageChangeListener(OnPageChangeListener listener) {
			this.listener = listener;
		}

		@Override
		public void onPageScrollStateChanged(int arg0) {
			if (null != listener) {
				listener.onPageScrollStateChanged(arg0);
			}
			if (arg0 == ViewPager.SCROLL_STATE_IDLE) {
				if (position == mAdapter.getCount() - 1) {
					setCurrentItem(1, false);
				} else if (position == 0) {
					setCurrentItem(mAdapter.getCount() - 2, false);
				}
			}
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			if (null != listener) {
				listener.onPageScrolled(arg0, arg1, arg2);
			}
		}

		@Override
		public void onPageSelected(int arg0) {
			position = arg0;
			if (null != listener) {
				listener.onPageSelected(arg0);
			}
		}
	}

	private class InnerPagerAdapter extends PagerAdapter {

		private PagerAdapter adapter;

		public InnerPagerAdapter(PagerAdapter adapter) {
			this.adapter = adapter;
			adapter.registerDataSetObserver(new DataSetObserver() {

				@Override
				public void onChanged() {
					notifyDataSetChanged();
				}

				@Override
				public void onInvalidated() {
					notifyDataSetChanged();
				}

			});
		}

		@Override
		public int getCount() {
			return adapter.getCount() + 2;
		}

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

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			if (position == 0) {
				position = adapter.getCount() - 1;
			} else if (position == adapter.getCount() + 1) {
				position = 0;
			} else {
				position -= 1;
			}
			return adapter.instantiateItem(container, position);
		}

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

	}
}




發佈了39 篇原創文章 · 獲贊 20 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章