先上效果,看看是否是你想找的效果:
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,
//删除成功后,需要通知adp刷新自己
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)在item的布局文件中,添加一个删除按钮,默认隐藏,向左滑动的时候显示按钮,向右滑动的时候隐藏按钮;
(2)实现后可能出现的bug, 第一次删除某个item没问题,接着删除后面的item可能会直接崩掉;
造成的原因: arg0 item选中项参数被设置为final类型的变量;
如果按照代码中第一处蓝色背景的代码来控制,可以解决程序崩掉的问题! 核心思想: 把position参数复制给 delBtn的 tag,需要传递到UI线程的时候在获取这个position参数;
如有更多疑问:欢迎加微信:Dkalan 详细沟通!