看完100篇博客(1)ListView滑动删除,仿腾讯QQ

学习的博客地址:http://blog.csdn.net/lmj623565791/article/details/22961279

学到的知识点:

1. 设置点击“删除按钮”的回调接口

    private DelBtnClickListener mListener;
    interface DelBtnClickListener{
        public void clickHappend(int position);
    }
    public void setDelBtnClickListener(DelBtnClickListener listener){
        this.mListener = listener;
    }

当点击删除按钮的时候调用clickHappend方法:  

        LayoutInflater mInflater = LayoutInflater.from(context);
        View view = mInflater.inflate(R.layout.delete_btn,null);
        Button DelBtn = (Button) view.findViewById(R.id.id_item_btn);
        DelBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mListener != null){
                    mListener.clickHappend(mCurrentPos);
                }
            }
        });

在MainActivity中具体实现:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        List<String> mDatas = new ArrayList<String>(Arrays.asList("一月","二月","三月"));
        final QQListView mListView = (QQListView) findViewById(R.id.id_listview);
        final ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mDatas);
        mListView.setAdapter(mAdapter);
        mListView.setDelBtnClickListener(new QQListView.DelBtnClickListener() {
            @Override
            public void clickHappend(int position) {
                mAdapter.remove(mAdapter.getItem(position));
            }
        });
    }

缺点:移除的时候 mAdapter.remove(String) , 是通过名字而不是 position来移除,所以如果存在两个相同的 Item ,删除第二个item的时候,删除的却是第一个item

2.判断【从左向右】滑动

      //如果两次滑动距离小于该值,就认为不是滑动
      int  touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

 

@Override
    public boolean dispatchTouchEvent(MotionEvent ev)
    {
        int action = ev.getAction();
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        switch (action)
        {

            case MotionEvent.ACTION_DOWN:
                xDown = x;
                yDown = y;
                /**
                 * 如果当前popupWindow显示,则直接隐藏,然后屏蔽ListView的touch事件的下传
                 */
                if (mPopupWindow.isShowing())
                {
                    dismissPopWindow();
                    return false;
                }
                // 获得当前手指按下时的item的位置  private int mCurrentViewPos;
                mCurrentViewPos = pointToPosition(xDown, yDown);
                // 获得当前手指按下时的item  private View mCurrentView
                View view = getChildAt(mCurrentViewPos - getFirstVisiblePosition());
                mCurrentView = view;
                break;
            case MotionEvent.ACTION_MOVE:
                xMove = x;
                yMove = y;
                int dx = xMove - xDown;
                int dy = yMove - yDown;
                /**
                 * 判断是否是从右到左的滑动. x方向移动了,但y方向没有移动。即【水平地】从右到左
                 */
                if (xMove < xDown && Math.abs(dx) > touchSlop && Math.abs(dy) < touchSlop)
                {
                    //
                    isSliding = true;
                }
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
    @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.popwindow_delete_btn_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();
                            }
                        }
                    });
                    // Log.e(TAG, "mPopupWindow.getHeight()=" + mPopupWindowHeight);

                    break;
                case MotionEvent.ACTION_UP:
                    isSliding = false;

            }
            // 相应滑动期间屏幕itemClick事件,避免发生冲突
            return true;
        }

        return super.onTouchEvent(ev);
    }

 

posted @ 2017-06-27 10:11  why_su  阅读(188)  评论(0编辑  收藏  举报