自定义超简单、帅气可滑动删除的ListView

滑动删除简单实用,现在大多数App都会用的功能,可是Android并不像I OS那样拖过来就能用。对于新手来说还是得死很多脑细胞的。就像我,试了很多方法,可是效果总是达不到要求。没办法既然项目要求,就得干啊!多亏前辈们留下的资源丰富,总算让我磨出来了,嘿嘿!
 废话也不说了,代码直接撸起!

首先自定义SlideDeleteView继承ListView

public class SlideDeleteView extends ListView{
    /**PopupWindow 加载删除按钮*/
    private PopupWindow mPopupWindow;
    private int mPopupWindowHeight;
    private Button mDelBtn;
    /** 滑动的最小距离 */
    private int minDistance;
    /** 是否是滑动状态*/
    private boolean isSliding;
    /**手指按下时的x坐标 */
    private int downX;
    /**手指按下时的y坐标*/
    private int downY;
    /** 手指移动时的x坐标*/
    private int moveX;
    /** 手指移动时的y坐标 */
    private int moveY;
    /* 为删除按钮提供一个回调接口*/
    private DelButtonClickListener mListener;
    /**当前手指触摸的View*/
    private View mCurrentView;
    /** 当前按下的位置 */
    private int mCurrentViewPos;

    /**
     * 构造函数
     * 初始化一些必要的数据
     */
    public SlideDeleteView(Context context, AttributeSet attrs) {
        super(context, attrs);
        minDistance=ViewConfiguration.get(context).getScaledTouchSlop();
        Viewview=LayoutInflater.from(context).
            inflate(R.layout.delete_btn, null);
        mDelBtn = (Button) view.findViewById(R.id.id_item_btn);
        mPopupWindow = new PopupWindow(view,
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT);
        /**
         * 先调用下measure,否则拿不到宽和高
         */
        mPopupWindow.getContentView().measure(0, 0);
        mPopupWindowHeight = 
        mPopupWindow.getContentView().getMeasuredHeight();
//      mPopupWindowWidth =
//      mPopupWindow.getContentView().getMeasuredWidth();
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent event){
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                downX = (int) event.getX();
                downY = (int) event.getY();
            /**
             * 如果当前popupWindow显示,则直接隐藏,然后屏蔽ListView的
             * touch事件的下传
             */
                if (mPopupWindow.isShowing()){
                    dismissPopWindow();
                    return false;
                }
            // 获得当前手指按下时的item的位置
                mCurrentViewPos = pointToPosition(downX, downY);
            // 获得当前手指按下时的item
            if(mCurrentViewPos <0){//没有点击到item,默认最后一个,也可以设置成当前不是在滑动状态
                mCurrentView =getChildAt(getLastVisiblePosition());
            }else{
                View view = getChildAt(mCurrentViewPos -
                 getFirstVisiblePosition());
                    mCurrentView = view;
                }
                break;
        case MotionEvent.ACTION_MOVE:
            moveX = (int) event.getX();
            moveY = (int) event.getY();
            int dx = moveX - downX;
            int dy = moveY - downY;
            /**
             * 判断是否是从右到左的滑动
             */
            if (moveX < downX && Math.abs(dx) > minDistance 
            &&Math.abs(dy) < minDistance){
                isSliding = true;
            }
            break;
        }
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev){
        int action = ev.getAction();
        /**
         * 如果是从右到左的滑动才相应
         */
        if (isSliding){

            switch (action){
                case MotionEvent.ACTION_MOVE:
                    int[] location = new int[2];
                // 获得当前item的位置x与y
                    mCurrentView.getLocationOnScreen(location);
                    // 设置popupWindow的出场动画
                                                                                mPopupWindow.setAnimationStyle(R.style.btn_delete_anim_style);
                mPopupWindow.update();
                mPopupWindow.showAtLocation(mCurrentView, Gravity.LEFT |
                 Gravity.TOP,location[0] + mCurrentView.getWidth(),
                 location[1] + mCurrentView.getHeight() / 2
                        - mPopupWindowHeight / 2);
                // 设置删除按钮的回调
                mDelBtn.setOnClickListener(new OnClickListener(){
                    @Override
                    public void onClick(View v){
                        if (mListener != null){
                            mListener.clickHappend(mCurrentViewPos);
                            mPopupWindow.dismiss();
                        }
                    }
                });
                break;
            case MotionEvent.ACTION_UP:
                isSliding = false;
                break;
            }
            // 相应滑动期间屏幕itemClick事件,避免发生冲突
            return true;
        }

        return super.onTouchEvent(ev);
    }

    /**
     * 隐藏popupWindow
     */
    private void dismissPopWindow(){
        if (mPopupWindow != null && mPopupWindow.isShowing()){
            mPopupWindow.dismiss();
        }
    }

    public void setDelButtonClickListener(DelButtonClickListener listener){
        mListener = listener;
    }

    /**button的回调接口*/
    public interface DelButtonClickListener{
        public void clickHappend(int position);
    }
}

这样就把滑动删除的自定义ListView完成了;下面看看怎么在activity中使用的代码,
xml就当做listview使用代码就不贴了,看下activity中的代码

public class MainActivity extends Activity {
    private SlideDeleteView deleteView;
    private MyAdapter mAdapter;
    private List<Persion> mDatas=new ArrayList<Persion>();

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

        deleteView = (SlideDeleteView) findViewById(R.id.slideDeleteView);
        initDate(); 
        mAdapter =new MyAdapter(this, mDatas);
        deleteView.setAdapter(mAdapter);

        deleteView.setDelButtonClickListener(new DelButtonClickListener()
        {
            @Override
            public void clickHappend(final int position){
                mDatas.remove(position);
                mAdapter.notifyDataSetChanged();
            }
        });

        deleteView.setOnItemClickListener(new OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> prent, View view,
             int position,long id) {
                //处理点击Item事件        
            }

        });
    }

    /**
     * 初始化数据
     */
    private void initDate() {
        Persion persion1=new Persion("张哈哈", "男", "11111");
        mDatas.add(persion1);
        Persion persion2=new Persion("李乐乐", "女", "22222");
        mDatas.add(persion2);
        Persion persion3=new Persion("王宝宝", "男", "333333");
        mDatas.add(persion3);
        Persion persion4=new Persion("赵欢欢", "女", "444444");
        mDatas.add(persion4);
        Persion persion5=new Persion("孙青青", "男", "555555");
        mDatas.add(persion5);
        Persion persion6=new Persion("刘哒哒", "男", "666666");
        mDatas.add(persion6);
    }


    class MyAdapter extends BaseAdapter{

        private Context context;
        private List<Persion> date=new ArrayList<Persion>();
        public MyAdapter(Context context, List<Persion> data) {
            super();
            this.context=context;
            this.date=data;
        }
        @Override
        public int getCount() {

            return date.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) {
            ViewHolder holder=null;
            if(convertView==null){
                holder=new ViewHolder();
                LayoutInflater Inflate= (LayoutInflater)context.getSystemService
                          (Context.LAYOUT_INFLATER_SERVICE);
                convertView=Inflate.inflate(R.layout.item_name_list, null);
                holder.tv_Name=(TextView)convertView.findViewById(R.id.tv_Name);
                holder.tv_Sex=(TextView)convertView.findViewById(R.id.tv_Sex);
                holder.tv_Phone=(TextView)convertView.findViewById(R.id.tv_Phone);
                convertView.setTag(holder);
            }else{
                holder=(ViewHolder) convertView.getTag();
            }

            holder.tv_Name.setText(date.get(position).getName());
            holder.tv_Sex.setText(date.get(position).getSex());
            holder.tv_Phone.setText(date.get(position).getPhone());     
            return convertView; 

        }

        class ViewHolder{
            TextView tv_Name;
            TextView tv_Sex;
            TextView tv_Phone;
        }   
    }

欧了,全部搞定,还有比这简单的吗?布局就不贴了,都太简单了,咱就不献丑,呵呵!看看效果如何
效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值