假如ListView中的Item存在Button,我们需要监听每个Item中Button的点击情况,这时候就需要在Adapter中通过Tag来实现,具体步奏如下:
关键代码:
public class OrderAdapter extends BaseAdapter {
private List<OrderItem> mDatas;
private Context mContext;
private LayoutInflater inflater;
private ViewHolder viewHolder;
private Handler mHandler;
private final int REFRESH=5;
//首先在构造方法里传入Handler(ListView中创建)
public OrderAdapter(List<OrderItem> mDatas, Context mContext,Handler mHandler) {
super();
this.mDatas = mDatas;
this.mContext = mContext;
this.mHandler=mHandler;
inflater = LayoutInflater.from(mContext);
}
......
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.order_item, parent, false);
viewHolder = new ViewHolder();
......
viewHolder.orderDelete = (Button) convertView
.findViewById(R.id.bt_order_delete);// 删除
viewHolder.orderDelete.setTag(position);//关键部分
viewHolder.orderDelete.setOnClickListener(new MyOnClickListener(viewHolder));
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
......
private class MyOnClickListener implements OnClickListener {
private ViewHolder viewHolder;
//这里一定要在构造方法中传入viewHolder,以便保证点击ListView中的按钮时数据的position不错乱。
public MyOnClickListener(ViewHolder viewHolder) {
this.viewHolder = viewHolder;
}
@Override
public void onClick(View v) {
int position = (Integer) viewHolder.orderDelete.getTag();//关键位置,配合setTag使用
Toast.makeText(mContext, "第"+position+"条订单将被删除", 0).show();
mDatas.remove(position);
mHandler.sendEmptyMessage(REFRESH);
}
}
在ListView类中:
adapter = new OrderAdapter(datas, this, mHandler);
lv_order_list.setAdapter(adapter);
......
Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case REFRESH:
adapter.notifyDataSetChanged();
break;
default:
break;
}
};
};
因为在ListView的Item中点击删除按钮后,操作在Adapter中进行,即在Adapter中操作数据集合,但是刷新Adapter需要在ListView中实现。所以在ListView中建立Handler作为参数传递给Adapter,adapter中即可通过handler通知ListView进行刷新,实现异步线程的通信。