ListView滑动删除

来源:互联网 发布:乐乎公寓官网电话 编辑:程序博客网 时间:2024/06/05 02:21

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滑动删除



1 0
原创粉丝点击