学习的博客地址: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); }