自定义listView添加滑动删除功能

今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个删除的事件,在事件中进行删除当选行的元素,刷新listview。

一共分为以下几步进行:

1、新建一个按钮的布局文件,用来作为动态添加的按钮:layout_button.xml

<?xml version="1.0" encoding="utf-8"?>
<Button 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:text="删除"
    android:layout_width="wrap_content"  
  android:layout_height="wrap_content" 
    android:id="@+id/btn1"/>

2、定义按钮显示,隐藏的动画效果,简单的缩放动画:

btn_hide.xml:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
  android:fromXScale="1.0"   
  android:toXScale="0"   
  android:fromYScale="1.0"   
  android:toYScale="1.0"   
  android:pivotX="100%"  
  android:pivotY="0"  
  android:duration="200"
  />

btn_show.xml:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
  android:fromXScale="0"   
  android:toXScale="1.0"   
  android:fromYScale="1.0"   
  android:toYScale="1.0"   
  android:pivotX="100%"  
  android:pivotY="0"  
  android:duration="200"
  />

3、自定义ListView,继承自listView,并实现OnTouchListener,OnGestureListener接口,代码就不一步一步写了,里面我尽可能的注释详细一些:MyListView.java

package com.example.viewtest;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ListView;
import android.widget.RelativeLayout;
  /**      
 * 项目名称:viewTest  
 * 实现功能:  自定义ListView,增加滑动删除功能
 * 类名称:MyListView   
 * 类描述:(该类的主要功能)
 * 创建人:徐纪伟 
 * E-mail: xujiwei558@126.com
 * 创建时间:2014年11月2日 下午3:37:40   
 * 修改人:   
 * 修改时间:   
 * 修改备注:   
 * @version    
 */
public class MyListView extends ListView implements OnTouchListener,OnGestureListener {
  
    /**
     * 手势识别类
     */
    private GestureDetector gestureDetector;
    
    /**
     * 滑动时出现的按钮
     */
    private View btnDelete;
    
    /**
     * listview的每一个item的布局
     */
    private ViewGroup viewGroup;
    /**
     * 选中的项
     */
    private int selectedItem;
    
    /**
     * 是否已经显示删除按钮
     */
    private boolean isDeleteShow;
    
    /**
     * 点击删除按钮时删除每一行的事件监听器
     */
    private OnItemDeleteListener onItemDeleteListener;

    /**
     * 构造函数,初始化手势监听器等
     * @param context
     * @param attrs
     */
    public MyListView(Context context, AttributeSet attrs) {
      super(context, attrs);
      gestureDetector = new GestureDetector(getContext(),this);
      setOnTouchListener(this);
    }
    

    public void setOnItemDeleteListener(OnItemDeleteListener onItemDeleteListener) {
      this.onItemDeleteListener = onItemDeleteListener;
    }



    @Override
    public boolean onTouch(View v, MotionEvent event) {
      //得到当前触摸的条目
      selectedItem = pointToPosition((int)event.getX(), (int)event.getY());
      //如果删除按钮已经显示,那么隐藏按钮,异常按钮在当前位置的绘制
      if (isDeleteShow) {
        btnHide(btnDelete);
        viewGroup.removeView(btnDelete);
        btnDelete = null;
        isDeleteShow = false;
        return false;
      }else{
        //如果按钮没显示,则触发手势事件
        //由此去触发GestureDetector的事件,可以查看其源码得知,onTouchEvent中进行了手势判断,调用onFling
        return gestureDetector.onTouchEvent(event);
      }
      
    }

    @Override
    public boolean onDown(MotionEvent e) {
      //得到当前触摸的条目
      if (!isDeleteShow) {
        selectedItem = pointToPosition((int)e.getX(), (int)e.getY());
      }
      return true;
    }