ListView滑动删除

ListView滑动删除肯定大家都见过,比如QQ对话列表中就可以!

那么这个功能具体是怎么实现的呢,ListView展示数据和列表点击都很容易实现,但是如果是触摸,就没法了,

必须通过我们自己的努力来改写它来实现!先上效果图:



不知道是不是大家想要的效果,主页代码很简单:(MainActivity.java)

package cq.cake.dellistview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private DelListView listView;
    private List<String> mDatas;
    private DelListViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initEvent();
    }

    private void initView() {
        listView = (DelListView) findViewById(R.id.del_listview);
    }

    private void initData() {
        mDatas = new ArrayList<String>();
        for (int i = 'A'; i <= 'Z'; i++) {
            mDatas.add("" + (char) i);
        }
        adapter = new DelListViewAdapter(this, mDatas);
        listView.setAdapter(adapter);
    }

    private void initEvent() {
        // 添加自定义listview的按钮单击事件,处理删除结果,和普通listview使用的唯一不同之处,
        listView.setOnItemDeleteListener(new DelListView.OnItemDeleteListener() {
            @Override
            public void onItemDelete(int index) {
                //删除当前数据集中对应数据,并刷新
                mDatas.remove(index);
                adapter.notifyDataSetChanged();
            }

        });
    }
}


主要的实现还是通过自定义的ListView来实现的:(DelListView.java)

package cq.cake.dellistview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ListView;

/**
 * My Application --  cq.cake.dellistview
 * Created by Small Cake on  2016/1/29 10:36.
 */
public class DelListView extends ListView implements GestureDetector.OnGestureListener,
        android.view.View.OnTouchListener {


    public DelListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        gestureDetector = new GestureDetector(getContext(), this);
        setOnTouchListener(this);
    }


    /**
     * 手势识别类
     */
    private GestureDetector gestureDetector;
    /**
     * 滑动时出现的按钮
     */
    private View btnDelete;
    /**
     * listview的每一个item的布局
     */
    private ViewGroup viewGroup;
    /**
     * 选中的项
     */
    private int selectedItem;
    /**
     * 是否已经显示删除按钮
     */
    private boolean isDeleteShow;
    /**
     * 点击删除按钮时删除每一行的事件监听器
     */
    private OnItemDeleteListener onItemDeleteListener;

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

    /**
     * @类名称: OnItemDeleteListener
     * @描述: 删除按钮监听器
     */
    public interface OnItemDeleteListener {
         void onItemDelete(int selectedItem);
    }

    @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;
    }

    @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) {
        // 如果删除按钮没有显示,并且手势滑动符合我们的条件
        // 此处可以根据需要进行手势滑动的判断,如限制左滑还是右滑,我这里是左滑右滑都可以
        Log.e("velocityX>>>","  "+Math.abs(velocityX)+"  ");
        Log.e("velocityY>>>","  "+Math.abs(velocityY)+"  ");
        if (!isDeleteShow && Math.abs(velocityX) > Math.abs(velocityY)) {
            // 在当前布局上,动态添加我们的删除按钮,设置按钮的各种参数、事件,按钮的点击事件响应我们的删除项监听器
            btnDelete = LayoutInflater.from(getContext()).inflate(R.layout.layout_button, null);
            /**
             * 删除按钮的点击事件
             */
                btnDelete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // btnHide(btnDelete);
                    viewGroup.removeView(btnDelete);
                    btnDelete = null;
                    isDeleteShow = false;
                    /**
                     * 把参数传入接口,进行回调
                     */
                    onItemDeleteListener.onItemDelete(selectedItem);
                }
            });
            viewGroup = (ViewGroup) getChildAt(selectedItem - getFirstVisiblePosition());
            viewGroup.addView(btnDelete);
            btnShow(btnDelete);
            isDeleteShow = true;
        } else {
            setOnTouchListener(this);
        }

        return false;
    }

    /**
     * @方法名称: btnShow
     * @描述: 按钮显示时的动画
     */
    private void btnShow(View v) {
        v.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.btn_show));
    }

    /**
     * @方法名称: btnHide
     * @描述: 按钮隐藏时的动画
     */
    private void btnHide(View v) {
        v.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.btn_hide));
    }
}

有了这两个主要文件,相信大家看看就能做出来同样的效果了,简单的布局和动画就不贴了,大家可以自己改造!

同时源码奉上,希望对需要的同学有所帮助:ListView滑动删除



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值