Android viewpager 嵌套 viewpager滑动 点击事件冲突解决方案

为了解决这个问题。可以自定义viewpager,然后在里面监听首饰,自定义点击事件

 

package com.hpuvoice.view;

import android.content.Context;
import android.graphics.PointF;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;

public class MyViewPager extends ViewPager implements OnGestureListener {

	/** 手势滑动处理类 **/
	private GestureDetector mDetector;
	/** 触摸时按下的点 **/
	PointF downP = new PointF();
	/** 触摸时当前的点 **/
	PointF curP = new PointF();

	OnSingleTouchListener onSingleTouchListener;

	public MyViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
		GestureDetector detector = new GestureDetector(context, this);
		mDetector = detector;
	}

	public GestureDetector getGestureDetector() {
		return mDetector;
	}

	@Override
	public boolean onTouchEvent(MotionEvent arg0) {
		curP.x = arg0.getX();
		curP.y = arg0.getY();
		getParent().requestDisallowInterceptTouchEvent(true);
		if (arg0.getAction() == MotionEvent.ACTION_DOWN) {
			downP.x = arg0.getX();
			downP.y = arg0.getY();
		}

		if (arg0.getAction() == MotionEvent.ACTION_MOVE) {
			// 此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
			getParent().requestDisallowInterceptTouchEvent(true);
		}

		if (arg0.getAction() == MotionEvent.ACTION_UP) {
			// 在up时判断是否按下和松手的坐标为一个点
			// 如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
			if ((downP.x == curP.x) && (downP.y == curP.y)) {
				onSingleTouch();
				return true;
			}
		}

		return super.onTouchEvent(arg0);
	}

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

	/**
	 * 单击   
	 */
	public void onSingleTouch() {
		if (onSingleTouchListener != null) {
			onSingleTouchListener.onSingleTouch();
		}
	}

	/**
	 *    * 创建点击事件接口    *   
	 */
	public interface OnSingleTouchListener {
		public void onSingleTouch();
	}

	public void setOnSingleTouchListener(
			OnSingleTouchListener onSingleTouchListener) {
		this.onSingleTouchListener = onSingleTouchListener;
	}

	@Override
	public boolean onDown(MotionEvent e) {
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {

	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		return false;
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {

	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		return false;
	}

}

  然后在使用该viewpager的类中,进行一系列监听,使用,同事本案例是为了展示首页轮播图的效果,其中另外一个点就是首页轮播图动态添加小圆点。并且实现轮播效果。

 

package com.hpuvoice.fragment;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.edaixi.activity.CityListActivity;
import com.edaixi.activity.LoginActivity;
import com.edaixi.activity.MainActivity;
import com.edaixi.activity.PlaceorderActivity;
import com.edaixi.activity.R;
import com.edaixi.activity.WebActivity;
import com.edaixi.appdata.Kclassdata;
import com.edaixi.appdata.KeepingData;
import com.edaixi.bean.Bannerlistbean;
import com.edaixi.bean.InappUrlbean;
import com.edaixi.bean.PostCommonBean;
import com.edaixi.listadpter.Myfuncadpter;
import com.edaixi.utils.Common;
import com.edaixi.utils.DensityUtil;
import com.edaixi.utils.NetUtil;
import com.edaixi.utils.SaveUtils;
import com.edaixi.view.MySpringRing;
import com.edaixi.view.MyViewPager.OnSingleTouchListener;
import com.google.gson.Gson;
import com.lidroid.xutils.BitmapUtils;

public class HomeFragment extends BaseFragment implements OnClickListener {
	private static final int GETBANNERFAILD = 2;
	private static final int GETBANNERSUCCED = 3;
	private static final int GETFUNCTIONBTNSUCCED = 4;
	private static final int GETFUNCTIONBTNFAILD = 5;
	boolean RequstFlag = false;
	private View view;
	private Button main_order_btn;
	private HashMap<String, String> parms;
	private SaveUtils saveUtils;
	private String address = "";
	private GridView main_grid;
	private Myfuncadpter adapter;
	private com.edaixi.view.MyViewPager myview_pager;
	private ImageView anim_trousers;
	private ImageView anim_womencloth;
	private ImageView anim_clothsmall;
	private ImageView imageView_title;
	private ArrayList<Bannerlistbean> funditonlist;
	private JSONObject str;
	private TitleAdapter title;
	private Animation tosmallanimation;
	private ImageView anim_sleeveshort;
	private ArrayList<Bannerlistbean> banerlistbak;
	private LinearLayout pager_bottom;
	private int Animorder;
	private MySpringRing cricleView;
	private ImageView point;
	private static TextView loction_text;
	private int currentPosition = 0;
	private boolean is_Loop_Flag = true;;

	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {
		private Gson gson = new Gson();

		@Override
		public void handleMessage(Message msg) {
			myview_pager.setCurrentItem(currentPosition);
			currentPosition++;
			if ((banerlistbak.size() > 0)
					&& (currentPosition > banerlistbak.size() - 1)) {
				currentPosition = (currentPosition % banerlistbak.size());
			}
			if (is_Loop_Flag) {
				handler.sendEmptyMessageDelayed(0, 3000);
			}
			try {
				switch (msg.what) {
				case GETBANNERSUCCED:
					PostCommonBean jsonCommonBean = gson.fromJson(
							(String) msg.obj, PostCommonBean.class);
					if (jsonCommonBean.isRet()) {
						String data = jsonCommonBean.getData();
						banerlistbak = null;
						banerlistbak = new ArrayList<Bannerlistbean>();
						paserbaner(data, banerlistbak);
						myview_pager.setCurrentItem(0);
						currentPosition = Integer.MAX_VALUE / 2
								- (Integer.MAX_VALUE / 2 % banerlistbak.size());
						addBannerPoint();
						TitleAdapter titlebak = new TitleAdapter(banerlistbak);
						myview_pager.setAdapter(titlebak);
						titlebak.notifyDataSetChanged();
					}
					break;
				case GETBANNERFAILD:
					break;
				case GETFUNCTIONBTNSUCCED:
					RequstFlag = true;
					PostCommonBean CommonBean = gson.fromJson((String) msg.obj,
							PostCommonBean.class);
					if (CommonBean.isRet()) {
						String data = CommonBean.getData();
						paserbaner(data, funditonlist);
						adapter.notifyDataSetChanged();
					}
					break;
				case GETFUNCTIONBTNFAILD:
					break;
				}
				super.handleMessage(msg);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	};

	@SuppressLint("HandlerLeak")
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		view = (LinearLayout) inflater.inflate(R.layout.fragment_home,
				container, false);
		main_order_btn = (Button) view.findViewById(R.id.main_order_btn);
		main_grid = (GridView) view.findViewById(R.id.main_grid);
		myview_pager = (com.edaixi.view.MyViewPager) view
				.findViewById(R.id.myview_pager);
		cricleView = (MySpringRing) view.findViewById(R.id.myring_circle);
		cricleView.startAnim();
		pager_bottom = (LinearLayout) view.findViewById(R.id.pager_bottom);
		anim_trousers = (ImageView) view.findViewById(R.id.anim_trousers);
		anim_womencloth = (ImageView) view.findViewById(R.id.anim_womencloth);
		anim_clothsmall = (ImageView) view.findViewById(R.id.anim_clothsmall);
		anim_sleeveshort = (ImageView) view.findViewById(R.id.anim_sleeveshort);
		loction_text = (TextView) view.findViewById(R.id.loction_text);
		loction_text.setOnClickListener(this);

		myview_pager.setCurrentItem(currentPosition);
		myview_pager.setOnPageChangeListener(new OnPageChangeListener() {
			@Override
			public void onPageSelected(int position) {
				currentPosition = position;
				if (pager_bottom.getChildCount() > 0) {
					for (int i = 0; i < banerlistbak.size(); i++) {
						pager_bottom.getChildAt(i).setBackgroundResource(
								getImageResIDs()[0]);
					}
					pager_bottom.getChildAt(position).setBackgroundResource(
							getImageResIDs()[1]);
				}
			}

			@Override
			public void onPageScrollStateChanged(int arg0) {
			}

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

		myview_pager.setOnSingleTouchListener(new OnSingleTouchListener() {

			@Override
			public void onSingleTouch() {
				Intent intent = new Intent();
				if (banerlistbak.get(myview_pager.getCurrentItem())
						.getUrl_type().equals("web")) {
					intent.putExtra("bannerlistbean",
							banerlistbak.get(myview_pager.getCurrentItem()));
					intent.setClass(getActivity(), WebActivity.class);
					startActivity(intent);
				} else if (banerlistbak.get(myview_pager.getCurrentItem())
						.getUrl_type().equals("in_app")) {
					if (!saveUtils.getBoolSP(KeepingData.LOGINED)) {
						intent.setClass(getActivity(), LoginActivity.class);
					} else {
						Gson gson = new Gson();
						InappUrlbean inappurlbean = gson.fromJson(banerlistbak
								.get(myview_pager.getCurrentItem()).getUrl(),
								InappUrlbean.class);
						intent.setClass(getActivity(), Kclassdata
								.getRechageclsss(inappurlbean.getKlass()));
					}
					startActivity(intent);
				}
			}
		});
		initView();
		handler.sendEmptyMessageDelayed(0, 3000);
		return view;
	}

	private void startanim() {
		tosmallanimation = (Animation) AnimationUtils.loadAnimation(
				getActivity(), R.anim.main_btn_scal_big);
		main_order_btn.startAnimation(tosmallanimation);
	}

	public static TextView getloctionview() {
		return loction_text;
	}

	private void get_func_button_list() {
		parms.clear();
		parms.put("width",
				String.valueOf(DensityUtil.getWidthInPx(getActivity())));
		parms.put("height",
				String.valueOf(DensityUtil.getHeightInPx(getActivity())));
		if (saveUtils.getStrSP(KeepingData.User_City_Id) != null) {
			parms.put("city_id", saveUtils.getStrSP(KeepingData.User_City_Id));
		} else {
			parms.put("city_id", "1");
		}
		((MainActivity) getActivity()).getdate(parms,
				Common.GET_FUNC_BUTTON_LIST, handler, GETFUNCTIONBTNSUCCED,
				GETFUNCTIONBTNFAILD, false, true, false);
	}

	private void get_banner_list() {
		parms.clear();
		parms.put("width",
				String.valueOf(DensityUtil.getWidthInPx(getActivity())));
		parms.put("height",
				String.valueOf(DensityUtil.getHeightInPx(getActivity())));
		if (saveUtils.getStrSP(KeepingData.User_City_Id) != null) {
			parms.put("city_id", saveUtils.getStrSP(KeepingData.User_City_Id));
		} else {
			parms.put("city_id", "1");
		}
		((MainActivity) getActivity()).getdate(parms, Common.GET_BANNER_LIST,
				handler, GETBANNERSUCCED, GETBANNERFAILD, true, true, false);

	}

	private void initView() {
		banerlistbak = new ArrayList<Bannerlistbean>();
		funditonlist = new ArrayList<Bannerlistbean>();
		saveUtils = new SaveUtils(this.getActivity());
		parms = new HashMap<String, String>();
		get_banner_list();
		title = new TitleAdapter(banerlistbak);
		myview_pager.setAdapter(title);
		adapter = new Myfuncadpter(getActivity(), funditonlist);
		main_grid.setAdapter(adapter);
		get_func_button_list();
		Animation toleftanim = (Animation) AnimationUtils.loadAnimation(
				getActivity(), R.anim.toleft_translaneannim);
		final Animation torightanim = (Animation) AnimationUtils.loadAnimation(
				getActivity(), R.anim.toright_translateanim);
		final Animation torightanim1 = (Animation) AnimationUtils
				.loadAnimation(getActivity(), R.anim.toleft_translation);
		final Animation toleftanim1 = (Animation) AnimationUtils.loadAnimation(
				getActivity(), R.anim.long_short_anim);
		AnimationListener animationListener = new AnimationListener() {
			@Override
			public void onAnimationStart(Animation animation) {
			}

			@Override
			public void onAnimationRepeat(Animation animation) {

			}

			@Override
			public void onAnimationEnd(Animation animation) {
				Animorder++;
				switch (Animorder) {
				case 1:
					anim_womencloth.startAnimation(torightanim);
					break;
				case 2:
					anim_clothsmall.startAnimation(torightanim1);
					break;
				case 3:
					anim_sleeveshort.startAnimation(toleftanim1);
					break;
				default:
					break;
				}
			}
		};
		anim_trousers.setVisibility(View.VISIBLE);
		anim_womencloth.setVisibility(View.VISIBLE);
		anim_clothsmall.setVisibility(View.VISIBLE);
		anim_sleeveshort.setVisibility(View.VISIBLE);
		anim_trousers.startAnimation(toleftanim);
		toleftanim.setAnimationListener(animationListener);
		torightanim.setAnimationListener(animationListener);
		torightanim1.setAnimationListener(animationListener);
		toleftanim1.setAnimationListener(animationListener);
		main_order_btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				startanim();
				tosmallanimation.setAnimationListener(new AnimationListener() {

					@Override
					public void onAnimationStart(Animation animation) {
					}

					@Override
					public void onAnimationRepeat(Animation animation) {
					}

					@Override
					public void onAnimationEnd(Animation animation) {

						if (!saveUtils.getBoolSP(KeepingData.LOGINED)) {
							startActivity(new Intent(getActivity(),
									LoginActivity.class));
							return;
						}
						;
						Intent intent = new Intent(getActivity(),
								PlaceorderActivity.class);
						intent.putExtra("from", "fromMain");
						intent.putExtra(KeepingData.ADDRESS_DATA, address);
						startActivity(intent);
					}
				});

			}
		});
		loction_text.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(getActivity(),
						CityListActivity.class);
				startActivityForResult(intent, getActivity().RESULT_FIRST_USER);
			}
		});
	}

	@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
		if (isVisibleToUser) {
			is_Loop_Flag = true;
			handler.sendEmptyMessageDelayed(0, 3000);
			if (NetUtil.getNetworkState(getActivity())) {
				if ((funditonlist != null) && !RequstFlag) {
					Timer timer = new Timer();
					timer.schedule(new TimerTask() {
						@Override
						public void run() {
							getActivity().runOnUiThread(new Runnable() {
								@Override
								public void run() {
									get_banner_list();
									get_func_button_list();
								}
							});
						}
					}, 500);
				}
			}
		} else {
			is_Loop_Flag = false;
		}
	}

	private int[] getImageResIDs() {
		return new int[] { R.drawable.splash_dot_default,
				R.drawable.splash_dot_current };
	}

	private class TitleAdapter extends PagerAdapter {

		private ArrayList<Bannerlistbean> mbannerlist;

		public TitleAdapter(ArrayList<Bannerlistbean> bannerlist) {
			super();
			mbannerlist = bannerlist;
		}

		@Override
		public int getCount() {
			int size = mbannerlist.size() == 0 ? 2 : mbannerlist.size();
			// if (mbannerlist.size() > 0) {
			// return size;
			// } else {
			// return 2;
			// }
			return 3;
		}

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

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

		@Override
		public Object instantiateItem(ViewGroup container, final int position) {
			View view = View
					.inflate(getActivity(), R.layout.bander_title, null);
			imageView_title = (ImageView) view
					.findViewById(R.id.iv_bander_title);
			imageView_title.setScaleType(ScaleType.CENTER_CROP);
			imageView_title.setImageResource(R.drawable.banner_default);
			if (mbannerlist.size() == 0) {
				container.addView(view, 0);
				return view;
			} else {
				BitmapUtils utils = new BitmapUtils(getActivity());
				utils.display(imageView_title, mbannerlist.get(position)
						.getImage_url());
				container.addView(view, position);
				return view;
			}
		}
	}

	/** 动态添加轮播图小圆点 **/
	protected void addBannerPoint() {
		for (int i = 0; i < banerlistbak.size(); i++) {
			point = new ImageView(getActivity());
			point.setBackgroundResource(R.drawable.splash_dot_current);

			LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
					LinearLayout.LayoutParams.WRAP_CONTENT,
					LinearLayout.LayoutParams.WRAP_CONTENT);
			params.gravity = Gravity.CENTER;
			point.setLayoutParams(params);
			point.setVisibility(View.VISIBLE);
			if (i == 0) {
				point.setEnabled(true);
			} else {
				point.setEnabled(false);
			}
			pager_bottom.addView(point);
		}
	}

	/** 解析banner结果方法 **/
	protected void paserbaner(String json, ArrayList<Bannerlistbean> bannerlist) {
		JSONArray jsonArray;
		bannerlist.clear();
		try {
			jsonArray = new JSONArray(json);
			for (int i = 0; i < jsonArray.length(); i++) {
				str = (JSONObject) jsonArray.opt(i);
				Bannerlistbean bannerlistbean = new Bannerlistbean();
				bannerlistbean.setImage_url(str.getString("image_url"));
				bannerlistbean.setUrl_type(str.getString("url_type"));
				bannerlistbean.setUrl(str.getString("url"));
				bannerlistbean.setTitle(str.getString("title"));
				if (str.getString("title").equals("按袋计费")) {
					saveUtils.saveStrSP(KeepingData.An_Dai_Ji_Fei_Url,
							str.getString("url"));
				} else if (str.getString("title").equals("按件计费")) {
					saveUtils.saveStrSP(KeepingData.An_Jian_Ji_Fei_Url,
							str.getString("url"));
				}
				bannerlist.add(bannerlistbean);
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

	/** 回调用户选中城市结果方法 **/
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (saveUtils.getStrSP(KeepingData.User_City) != "") {
			loction_text.setText(saveUtils.getStrSP(KeepingData.User_City));
			get_banner_list();
			get_func_button_list();
		}
	}

	/** dp px 转换工具方法 **/
	private int dp2px(int dp) {
		return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
				getResources().getDisplayMetrics());
	}
}

  布局就省略了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。