这事滑动删除的效果图:
下面主要贴出 ListView Adapter 中的核心代码:
@Override
public View getView(int arg0, View item, ViewGroup parent) {
// TODO Auto-generated method stub
Holder holder = null;
if (item == null) {
holder = new Holder();
item = mInflater.inflate(R.layout.cammicate_item, null);
holder.imglogoTV = (ImageView) item.findViewById(R.id.logo);
holder.nameTV = (TextView) item.findViewById(R.id.nameTV);
holder.timeTV = (TextView) item.findViewById(R.id.timeTV);
holder.lastMsgTV = (TextView) item.findViewById(R.id.contentTV);
holder.msgCountTV = (TextView) item.findViewById(R.id.msg);
holder.delBtn=(Button)item.findViewById(R.id.delBtn);
item.setTag(holder);
} else {
holder = (Holder) item.getTag();
}
//将 当前item的 position arg0参数设置为删除按钮的 tag
holder.delBtn.setTag(arg0);
final Button bt_delete=(Button)holder.delBtn;
item.setOnTouchListener(new OnTouchListener() {
int downX=0,upX=0;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction())// 根据动作来执行代码
{
case MotionEvent.ACTION_MOVE:// 滑动
break;
case MotionEvent.ACTION_DOWN:// 按下
v.setPressed(true);// item的点击效果
downX = (int)event.getX();
break;
case MotionEvent.ACTION_UP:// 松开
v.setPressed(false);// item的点击效果
upX = (int)event.getX();
if (upX-downX>=50&&bt_delete.getVisibility()==View.VISIBLE) { //右滑
bt_delete.setVisibility(View.GONE);
bt_delete.setClickable(false);
return true;
}
else if(upX-downX<=-50) //左滑,显示删除按钮
{
bt_delete.setVisibility(View.VISIBLE);
bt_delete.setClickable(true);
bt_delete.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
v.setVisibility(View.GONE);
v.setClickable(false);
Message msg=new Message();
msg.what=MainActivity.MSG_WHAT_DEL_CHAT;
//将删除item的位置 从 删除按钮的 tag中获取到,并作为handler的 obj对象,发送到UI线程中去 删除需要删除的item,
//删除成功后,需要通知adapter刷新自己
msg.obj=bt_delete.getTag();
mHandler.sendMessage(msg);
}
});
return true;
}
else
{
bt_delete.setClickable(false);
}
// 因为 删除按钮 提前响应了listView的 onItemClick事件,如果用户没有进行删除操作,当用户点击item的时候,需要需用
//performItemClick 事件来响应 item的 点击事件
listView.performItemClick(v,Integer.parseInt(bt_delete.getTag().toString()),
listView.getItemIdAtPosition(Integer.parseInt(bt_delete.getTag().toString())));
return false;
default:
break;
}
return true;
}
});
return item;
}
public class Holder {
public ImageView imglogoTV;
public TextView nameTV;
public TextView timeTV;
public TextView lastMsgTV;
public TextView msgCountTV;
public Button delBtn;
}
代码说明:
(1) 蓝色背景标注的代码为重难点代码
(2) 可能出现的bug: 第一次删除某一项成功,接着删除该item后面的意向程序会崩掉;
造成错误的原因: arg0 变量被你设置为final类型的;你删除成功后,list 减少了一项,但是你的view 中的pos值并未动态的改变;
第一处蓝色背景文字的代码可以解决(2)描述的bug