listView的基本用法就不一一介绍了,直接看核心代码。
1、自定义DeletableListView继承ListView,在构造方法内使用GestureDetector如下:
public DeletableListView(Context context, AttributeSet attrs) { super(context, attrs); /** * 调用gestureDetector手势监听方法 */ gestureDetector = new GestureDetector(context, new GestureDetector.OnGestureListener() { @Override public boolean onDown(MotionEvent motionEvent) { selectItem = pointToPosition((int) motionEvent.getX(), (int) motionEvent.getY()); return false; } @Override public void onShowPress(MotionEvent motionEvent) { } @Override public boolean onSingleTapUp(MotionEvent motionEvent) { return false; } @Override public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { return false; } @Override public void onLongPress(MotionEvent motionEvent) { } @Override public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { if (motionEvent.getX() > motionEvent1.getX()) { final ViewGroup itemLayout = (ViewGroup) getChildAt(selectItem); //初始化需要添加到item收的RelataviLayout final RelativeLayout deleteLayout = new RelativeLayout(getContext()); //创建RelativeLayout的参数类 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); //指定deleteLayout显示在item的最右边 params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); //指定deleteLayout垂直居中 params.addRule(RelativeLayout.CENTER_VERTICAL); //动态设置deleteLayout的属性值 deleteLayout.setLayoutParams(params); //初始化删除图标 ImageView deleteImage = new ImageView(getContext()); deleteImage.setImageResource(android.R.drawable.ic_delete); //设置删除图标的点击事件 deleteImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { isImageShown = false; itemLayout.removeView(deleteLayout); if (onItemDeletedListener != null) { onItemDeletedListener.onItemDeleted(selectItem); } } }); deleteLayout.addView(deleteImage); itemLayout.addView(deleteLayout); isImageShown = true; } return false; } });
2、要想GestureDetector起作用还需将listView的touch事件传递给GestureDetector,如下:
setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return gestureDetector.onTouchEvent(motionEvent); } });