基于前人的经验改善而来。
资料连接:
仿 QQ消息列表的滑动出现 删除按钮
http://www.eoeandroid.com/thread-313964-1-1.html
android listView滑动删除http://my.eoe.cn/jiaxiaoya/archive/20879.html
第二种实现的工程
https://github.com/axlecho/moli_blog_qqdel
第一种的实现
private class ListAdapter extends BaseAdapter { @Override public int getCount() { return listDatas.size(); } @Override public Object getItem(int pos) { return listDatas.get(pos); } @Override public long getItemId(int pos) { return 0; } @Override public View getView(final int pos, View convertView, ViewGroup parent) { View view = getLayoutInflater().inflate(R.layout.list_item_view, null); TextView textView = (TextView) view.findViewById(R.id.text); textView.setText(listDatas.get(pos)); view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent me) { switch (me.getAction()) { case MotionEvent.ACTION_MOVE:break; case MotionEvent.ACTION_DOWN: v.setBackgroundColor(Color.CYAN); //模拟按下效果 downX = me.getX(); break; case MotionEvent.ACTION_UP: upX = me.getX(); v.setBackgroundColor(Color.TRANSPARENT); if (Math.abs(upX - downX) > 20) { //滑动事件的响应 } else { //点击事件的调用,记住这个pos必须是getview的参数, //必须为final,可能是跟调用闭包有关 //手动调用列表的点击操作。 listView.performItemClick(v, pos, listView.getItemIdAtPosition(pos)); } break; default:break; } return true; } }); return view; } }
第二种的实现
private class ListViewEx extends ListView implements OnTouchListener { private int pointX = -1; private int pointY = -1; private int position = -1; private int endX = -1; private int endY = -1; private int newpos = -1; private Button curDel_btn; private TextView curMask; private Context parentContext; public ListViewEx(Context context) { super(context); setOnTouchListener(this); parentContext = context; } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 手指按下,计算焦点位于ListView的那个条目 pointX = (int) event.getX(); pointY = (int) event.getY(); position = listView.pointToPosition(pointX, pointY); if (curDel_btn != null) { curDel_btn.setVisibility(View.GONE); } if (curMask != null) { curMask.setVisibility(View.GONE); } break; case MotionEvent.ACTION_MOVE:break; case MotionEvent.ACTION_UP: endX = (int) event.getX(); endY = (int) event.getY(); newpos = listView.pointToPosition(endX, endY); // 原本想着加上这个条件(newpos==position)是不是更精确些, // 经过实践发现,其实我们在滑动listView的列表的时候有时候更渴望有滑动就ok // 只允许从右向左滑 if (endX - pointX < -50) { // 获取到ListView第一个可见条目的position int firstVisiblePosition = listView.getFirstVisiblePosition(); View view = listView.getChildAt(position - firstVisiblePosition); if (view == null)break; Button delbtn = (Button) view.findViewById(R.id.btn_del); TextView delbtnMask = (TextView) view.findViewById(R.id.btn_del_mask); TextView bottomMask = (TextView) view.findViewById(R.id.bottom_mask); //加载动画 bottomMask.setVisibility(View.VISIBLE); delbtn.setVisibility(View.VISIBLE); delbtnMask.setVisibility(View.VISIBLE); delbtnMask.startAnimation(AnimationUtils.loadAnimation(parentContext, R.anim.delete_show)); delbtnMask.setVisibility(View.INVISIBLE); curDel_btn = delbtn; curMask = bottomMask; delbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { deleteRecord(listDatas.get(position)); listDatas.remove(position); adapter.notifyDataSetChanged(); } }); } break; default:break; } return false; } }