Android 手势滑动删除ListView

概要:

Android 手势滑动删除ListView

| |目录

正文

package net.xsoftlab.baike;
public class TestSwipeListView extends Activity implements OnTouchListener {
	private String str[] = new String[] { "A", "B", "c", "D", "E", "c", "D",
			"E", "c", "D", "E", "D", "E", "c", "D", "E", "D", "E", "c", "D",
			"E", "D", "E", "c", "D", "E" };
	private ListView swipListView;
	private DelSwipeAdapter delAdapter;
	private DisplayMetrics dm;
	private GestureDetector mGestureDetector;
	private ArrayList<DataObject> dataList = new ArrayList<DataObject>();
	private HashMap<String, ViewObject> viewMap = new HashMap<String, ViewObject>();
	private RelativeLayout.LayoutParams goneRightLayoutParams;
	private RelativeLayout.LayoutParams showRightLayoutParams;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_swipelist);
		dm = getResources().getDisplayMetrics();
		goneRightLayoutParams = new RelativeLayout.LayoutParams(dm.widthPixels,
				DensityUtil.dip2px(TestSwipeListView.this, 60));
		showRightLayoutParams = new RelativeLayout.LayoutParams(dm.widthPixels,
				DensityUtil.dip2px(TestSwipeListView.this, 60));
		mGestureDetector = new GestureDetector(this, new SwipeGestore());
		for (int i = 0; i < str.length; i++) {
			dataList.add(new DataObject(i + "uniqueId", i + "summary"));
		}
		swipListView = (ListView) findViewById(R.id.swipe_listview);
		delAdapter = new DelSwipeAdapter();
		swipListView.setAdapter(delAdapter);
		swipListView.setOnTouchListener(this);
	}
	class DataObject {
		public String uniqueId;
		public String summary;
		public DataObject(String uniqueId, String summary) {
			this.uniqueId = uniqueId;
			this.summary = summary;
		}
	}
	@Override
	public boolean onTouch(View arg0, MotionEvent arg1) {
		try {
			return mGestureDetector.onTouchEvent(arg1);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return super.onTouchEvent(arg1);
	}
	class DelSwipeAdapter extends BaseAdapter implements OnClickListener {
		/**
		 * 要显示的底部操作View Index位置 -1为默认没有(重置状态)
		 */
		private int itemBottomViewItemIndex = -1;
		/**
		 * 要显示的右侧删除View Index位置 -1为默认没有(重置状态)
		 */
		private int itemRightDelViewItemIndex = -1;
		/**
		 * 整个Adapter是否有(底部显示操作)View
		 */
		public boolean adapterIsHaveShowBottomView = false;
		/**
		 * 整个Adapter是否有(右侧删除操)作View
		 */
		public boolean adapterIsHaveShowRightDelView = false;
		@Override
		public int getCount() {
			return dataList.size();
		}
		@Override
		public Object getItem(int arg0) {
			return null;
		}
		@Override
		public long getItemId(int arg0) {
			return 0;
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			DataObject dataObject = dataList.get(position);
			// 初始化,没有使用ViewHolder
			if (!viewMap.containsKey(dataObject.uniqueId)) {
				View mView = getLayoutInflater().inflate(
						R.layout.layout_swipelist_item, null);
				LinearLayout textMain = (LinearLayout) mView
						.findViewById(R.id.text_main);
				Button textDel = (Button) mView.findViewById(R.id.text_del);
				TextView textBottom = (TextView) mView
						.findViewById(R.id.text_bottom);
				TextView mText = (TextView) textMain.getChildAt(0);
				mText.setText(position + "textMain");
				textDel.setText(position + "textDel");
				textBottom.setText(position + "textBottom");
				ViewObject viewObject = new ViewObject(mView, position, false,
						false);
				viewMap.put(dataObject.uniqueId, viewObject);
			}
			convertView = viewMap.get(dataObject.uniqueId).mContentView;
			TextView textDel = (TextView) convertView
					.findViewById(R.id.text_del);
			textDel.setTag(position);
			textDel.setOnClickListener(this);
			// //////////////////////Item点击操作-start////////////////////////
			if (itemBottomViewItemIndex == -1) {
				adapterIsHaveShowBottomView = false;
				viewMap.get(dataObject.uniqueId).isShowBottomView = false;
				goneBottomView(convertView);
			} else if (position == itemBottomViewItemIndex) {
				if (viewMap.containsKey(dataObject.uniqueId)) {
					boolean isShowing = viewMap.get(dataObject.uniqueId).isShowBottomView;
					if (!isShowing) {
						adapterIsHaveShowBottomView = true;
						viewMap.get(dataObject.uniqueId).isShowBottomView = true;
						showBottomView(convertView);
					}
				}
			} else {
				viewMap.get(dataObject.uniqueId).isShowBottomView = false;
				goneBottomView(convertView);
			}
			// //////////////////////Item点击操作-end////////////////////////
			// ------------------------Norway的分割线----------------------//
			// //////////////////////Item滑动操作-start////////////////////////
			if (itemRightDelViewItemIndex == -1) {
				adapterIsHaveShowRightDelView = false;
				viewMap.get(dataObject.uniqueId).isShowRightDelView = false;
				goneRightDel(convertView);
			} else if (position == itemRightDelViewItemIndex) {
				if (viewMap.containsKey(dataObject.uniqueId)) {
					boolean isFling = viewMap.get(dataObject.uniqueId).isShowRightDelView;
					if (!isFling) {
						adapterIsHaveShowRightDelView = true;
						viewMap.get(dataObject.uniqueId).isShowRightDelView = true;
						showRightDel(convertView);
					}
				}
			} else {
				viewMap.get(dataObject.uniqueId).isShowRightDelView = false;
				goneRightDel(convertView);
			}
			// //////////////////////Item滑动操作-end////////////////////////
			return convertView;
		}
		/**
		 * 根据ItemIndex显示底部操作View
		 * 
		 * @param itemIndex
		 */
		public void showBottomViewByItemIndex(int itemIndex) {
			this.itemBottomViewItemIndex = itemIndex;
			notifyDataSetChanged();
			// notifyDataSetInvalidated();
		}
		/**
		 * 根据ItemIndex显示右侧删除View
		 * 
		 * @param itemIndex
		 */
		public void showRightDelViewByItemIndex(int itemIndex) {
			this.itemRightDelViewItemIndex = itemIndex;
			notifyDataSetChanged();
			// notifyDataSetInvalidated();
		}
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.text_del:
				int position = (Integer) v.getTag();
				DataObject dataObject = dataList.get(position);
				viewMap.remove(dataObject.uniqueId);
				dataList.remove(position);
				showRightDelViewByItemIndex(-1);
				notifyDataSetInvalidated();
				break;
			}
		}
	}
	/**
	 * View 对象
	 * 
	 * @author Norway
	 * 
	 */
	class ViewObject {
		/**
		 * Item View
		 */
		View mContentView;
		/**
		 * Item Index
		 */
		int index;
		/**
		 * 是否显示 底部---操作布局
		 */
		boolean isShowBottomView;
		/**
		 * 是否显示 右侧---删除布局
		 */
		boolean isShowRightDelView;
		public ViewObject(View mContentView, int index,
				boolean isShowBottomView, boolean isShowRightDelView) {
			this.mContentView = mContentView;
			this.index = index;
			this.isShowBottomView = isShowBottomView;
			this.isShowRightDelView = isShowRightDelView;
		}
	}
	/**
	 * 滑动手势处理
	 * 
	 * @author Norway
	 * 
	 */
	private class SwipeGestore extends GestureDetector.SimpleOnGestureListener {
		/**
		 * 垂直(上下)滑动最小距离
		 */
		private int verticalMinDistance = 40;
		/**
		 * 水平(左右)滑动最小距离
		 */
		private int horactionMinDistance = 20;
		/**
		 * 滑动最小速率
		 */
		private int minVelocity = 0;
		/**
		 * 
		 */
		private int clickPosition = -1;
		@Override
		public boolean onDown(MotionEvent e) {
			clickPosition = getListItemPosition(e);
			return super.onDown(e);
		}
		@Override
		public boolean onSingleTapUp(MotionEvent e) {
			Log.d("INFO", "onSingleTapUp");
			DataObject dataObject = dataList.get(clickPosition);
			// 当前Position 删除View是否处于显示状态
			boolean currentIsShowRightDelView = viewMap
					.get(dataObject.uniqueId).isShowRightDelView;
			// 当前是显示的或者adapter里面有其它处于显示,则重置View
			if (currentIsShowRightDelView
					|| delAdapter.adapterIsHaveShowRightDelView) {
				delAdapter.showRightDelViewByItemIndex(-1);
				return false;
			}
			// 当前Positioni 底部View是否处于显示状态
			boolean currentIsShowBottomView = viewMap.get(dataObject.uniqueId).isShowBottomView;
			// 如果当前是显示状态,则重置View
			if (currentIsShowBottomView) {
				viewMap.get(dataObject.uniqueId).isShowBottomView = false;
				delAdapter.showBottomViewByItemIndex(-1);
			} else// 显示当前底部View
			{
				delAdapter.showBottomViewByItemIndex(clickPosition);
			}
			return super.onSingleTapUp(e);
		}
		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {
			Log.d("INFO", "onFling e1=" + e1 + "---e2=" + e2);
			Log.d("INFO", "onFling e1 x=" + e1.getX() + "--y=" + e1.getY());
			Log.d("INFO", "onFling e2 x=" + e2.getX() + "--y=" + e2.getY());
			int x1 = (int) (e1.getX() - e2.getX());
			int y1 = (int) (e1.getY() - e2.getY());
			Log.d("INFO", "onFling x1=" + x1 + "---y1=" + y1);
			clickPosition = getListItemPosition(e1);
			Log.d("INFO", "itemPosition=" + clickPosition);
			DataObject dataObject = dataList.get(clickPosition);
			// 判断手指重左向右滑,滑动的水平距离要大于20 并且垂直距离要小于40 (确实是滑动这个Item,而不是整个ListView)
			if (e1.getX() - e2.getX() > horactionMinDistance
					&& Math.abs(velocityX) > minVelocity
					&& Math.abs(e1.getY() - e2.getY()) < verticalMinDistance) {
				Log.d("INFO", "item onFling Left");
				// 当前是否有显示底部操作View
				boolean currentIsShowBottomView = viewMap
						.get(dataObject.uniqueId).isShowBottomView;
				// 若有底部操作View 或 Adapter有其它View 则重置
				if (currentIsShowBottomView
						|| delAdapter.adapterIsHaveShowBottomView) {
					delAdapter.showBottomViewByItemIndex(-1);
					return false;
				}
				// 选择当前ItemView
				delAdapter.showRightDelViewByItemIndex(clickPosition);
			}// 判断手指重右向左滑,滑动的水平距离要大于20 并且垂直距离要小于40 (确实是滑动这个Item,而不是整个ListView)
			else if (e2.getX() - e1.getX() > horactionMinDistance
					&& Math.abs(velocityX) > minVelocity
					&& Math.abs(e2.getY() - e1.getY()) < verticalMinDistance) {
				Log.d("INFO", "item onFling Right");
				// 当前Del View 是否有显示
				boolean currentIsShowRightDelView = viewMap
						.get(dataObject.uniqueId).isShowRightDelView;
				// 当前View显示则重置列表
				if (currentIsShowRightDelView) {
					delAdapter.showRightDelViewByItemIndex(-1);
					return false;
				}
			}
			return super.onFling(e1, e2, velocityX, velocityY);
		}
		/**
		 * 根据事件Event点获取ListView的ItemPosition位置
		 * 
		 * @param event
		 * @return
		 */
		private int getListItemPosition(MotionEvent event) {
			return swipListView.pointToPosition((int) event.getX(),
					(int) event.getY());
		}
	}
	/**
	 * 显示底部操作View
	 * 
	 * @param rootView
	 */
	private void showBottomView(View rootView) {
		TextView textBottom = (TextView) rootView
				.findViewById(R.id.text_bottom);
		textBottom.setVisibility(View.VISIBLE);
	}
	/**
	 * 隐藏底部操作View
	 * 
	 * @param rootView
	 */
	private void goneBottomView(View rootView) {
		TextView textBottom = (TextView) rootView
				.findViewById(R.id.text_bottom);
		textBottom.setVisibility(View.GONE);
	}
	/**
	 * 显示右侧删除View
	 * 
	 * @param rootView
	 */
	private void showRightDel(View mRootView) {
		final LinearLayout textMain = (LinearLayout) mRootView
				.findViewById(R.id.text_main);
		showRightLayoutParams.leftMargin = -200;
		textMain.setLayoutParams(showRightLayoutParams);
	}
	/**
	 * 隐藏右侧删除View
	 * 
	 * @param rootView
	 */
	private void goneRightDel(View mRootView) {
		LinearLayout textMain = (LinearLayout) mRootView
				.findViewById(R.id.text_main);
		goneRightLayoutParams.leftMargin = 0;
		textMain.setLayoutParams(goneRightLayoutParams);
	}
}

来源

来自CSDN博客:手势滑动删除ListView


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消