Android下ListView每个Item中包含有多个按钮,当我们点击某一个item中的按钮的时候,同时有多行button触发了响应事件。
就会产生下图的效果:
点击第一个item中的第一个按钮后,后面item的按钮的状态也发生变化了,这不是我们期望的。我们可以使用下面方法解决
参考链接:http://www.2cto.com/kf/201403/286545.html
为了解决这个问题,我们使用回调ListView点击事件的接口的方法来解决。
大概思路就是:得确定点击了ListView中那个item中的那个控件(按钮),然后设置该控件(按钮)的监听事件,在监听事件方法中回调这个接口ListItemClickHelp
ListItemClickHelp.java
package com.xbmu.driver.view;
import android.view.View;
/**
* listview点击事件接口
* Created by Administrator on 2016/2/17 0017.
*/
public interface ListItemClickHelp {
/**
* 点击item条目中某个控件回调的方法
* @param item ListView中item布局的View对象
* @param parent 父容器对象
* @param position item在ListView中所处的位置
* @param which item中要点击的控件的id
*/
void onClick(View item, View parent, int position, int which);
}
定义ListView中需要的适配器
OrderCarListItemClickAdapter.java
package com.xbmu.driver.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import com.xbmu.driver.R;
import com.xbmu.driver.bean.OrderCarBean.OrderCar;
import com.xbmu.driver.view.ListItemClickHelp;
import java.util.ArrayList;
public class OrderCarListItemClickAdapter extends BaseAdapter {
private Context contxet;
private ArrayList<OrderCar> mDatas;
private ListItemClickHelp callback;
private LayoutInflater mInflater;
/**
* @param contxet 上下文
* @param mDatas 填充的数据
* @param callback 定义的listview点击事件接口
*/
public OrderCarListItemClickAdapter(Context contxet, ArrayList<OrderCar> mDatas,
ListItemClickHelp callback) {
this.contxet = contxet;
this.mDatas = mDatas;
this.callback = callback;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public OrderCar getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
mInflater = (LayoutInflater) contxet
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.ordercar_pager_item, null);
holder = new ViewHolder();
holder.tvDate = (TextView) convertView.findViewById(R.id.item_date);
holder.time1 = (TextView) convertView.findViewById(R.id.item_time1);
holder.time2 = (TextView) convertView.findViewById(R.id.item_time2);
holder.time3 = (TextView) convertView.findViewById(R.id.item_time3);
holder.num1 = (TextView) convertView.findViewById(R.id.item_num1);
holder.num2 = (TextView) convertView.findViewById(R.id.item_num2);
holder.num3 = (TextView) convertView.findViewById(R.id.item_num3);
holder.btn1 = (Button) convertView.findViewById(R.id.item_btn1);
holder.btn2 = (Button) convertView.findViewById(R.id.item_btn2);
holder.btn3 = (Button) convertView.findViewById(R.id.item_btn3);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvDate.setText(getItem(position).orderdate);
String orderTimeStr = getItem(position).schedule.ordertime;
String[] orderTimeArr = orderTimeStr.split("\\|");
holder.time1.setText(orderTimeArr[0]);
holder.time2.setText(orderTimeArr[1]);
holder.time3.setText(orderTimeArr[2]);
String ordernumStr = getItem(position).schedule.ordernum;
holder.num1.setText(ordernumStr);
holder.num2.setText(ordernumStr);
holder.num3.setText(ordernumStr);
//根据可预约数量监听按钮的状态
if (Integer.parseInt(ordernumStr) > 0) {
holder.btn1.setBackgroundResource(R.drawable.ordered_shape);
holder.btn1.setText("约车");
holder.btn2.setBackgroundResource(R.drawable.ordered_shape);
holder.btn2.setText("约车");
holder.btn3.setBackgroundResource(R.drawable.ordered_shape);
holder.btn3.setText("约车");
} else {
holder.btn1.setBackgroundResource(R.drawable.no_order_shape);
holder.btn1.setText("无车");
holder.btn2.setBackgroundResource(R.drawable.no_order_shape);
holder.btn2.setText("无车");
holder.btn3.setBackgroundResource(R.drawable.no_order_shape);
holder.btn3.setText("无车");
}
final View view = convertView;
final int p = position;
//获取按钮的id
final int one = holder.btn1.getId();
//设置按钮的点击事件
holder.btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//回调接口中listview点击事件
callback.onClick(view, parent, p, one);
}
});
final int two = holder.btn2.getId();
holder.btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
callback.onClick(view, parent, p, two);
}
});
final int three = holder.btn3.getId();
holder.btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
callback.onClick(view, parent, p, three);
}
});
return convertView;
}
public static class ViewHolder {
private TextView tvDate;
private TextView time1;
private TextView time2;
private TextView time3;
private TextView num1;
private TextView num2;
private TextView num3;
private Button btn1;
private Button btn2;
private Button btn3;
}
}
OrderCarPager.java
package com.xbmu.driver.base.impl;
import android.app.Activity;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.google.gson.Gson;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.xbmu.driver.R;
import com.xbmu.driver.adapter.OrderCarListItemClickAdapter;
import com.xbmu.driver.base.BasePager;
import com.xbmu.driver.bean.OrderCarBean;
import com.xbmu.driver.bean.OrderCarBean.OrderCar;
import com.xbmu.driver.global.GlobalVariables;
import com.xbmu.driver.utils.DialogUtil;
import com.xbmu.driver.utils.HttpUtil;
import com.xbmu.driver.utils.SharedPreferencesUtil;
import com.xbmu.driver.view.ListItemClickHelp;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* 预约练车
* Created by Administrator on 2016/2/5 0005.
*/
public class OrderCarPager extends BasePager implements ListItemClickHelp {
private View orderCarView;
@ViewInject(R.id.lv_order_car)
private ListView lvOrderCar;
private OrderCarBean orderCarBean;
private ArrayList<OrderCar> orderCars;
private OrderCarListItemClickAdapter madapter;
private String ordernum;//可约的数量
public OrderCarPager(Activity mActivity) {
super(mActivity);
}
@Override
public void initView() {
super.initView();
setSlingMenuEnable(true);
tvTitle.setText("预约练车");
ibMenu.setVisibility(View.VISIBLE);
orderCarView = View.inflate(mActivity, R.layout.ordercar_pager, null);
ViewUtils.inject(this, orderCarView);
flContent.addView(orderCarView);
}
@Override
public void initData() {
//从服务器获取数据,填充适配器
getDataFromServer();
}
public void getDataFromServer() {
HttpUtils httpUtils = new HttpUtils();
RequestParams params = new RequestParams();
params.addQueryStringParameter("pageNo", "1");
httpUtils.send(HttpRequest.HttpMethod.POST, GlobalVariables.ORDER_CAR_DATA, params, new RequestCallBack<String>() {
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
//解析数据
parseData(result);
}
@Override
public void onFailure(HttpException e, String s) {
e.printStackTrace();
}
});
}
private void parseData(String result) {
Gson gson = new Gson();
orderCarBean = gson.fromJson(result, OrderCarBean.class);
orderCars = orderCarBean.orderCars;
//设置适配器
madapter = new OrderCarListItemClickAdapter(mActivity, orderCars, this);
lvOrderCar.setAdapter(madapter);
}
@Override
public void onClick(View item, View parent, int position, int which) {
boolean logined = SharedPreferencesUtil.getBoolean(mActivity, "logined", false);
switch (which) {
case R.id.item_btn1:
Button btn1 = (Button) item.findViewById(R.id.item_btn1);
TextView time1 = (TextView) item.findViewById(R.id.item_time1);
TextView num1 = (TextView) item.findViewById(R.id.item_num1);
onClickOrderCatBtn(btn1, logined, position, time1, num1);
break;
case R.id.item_btn2:
Button btn2 = (Button) item.findViewById(R.id.item_btn2);
TextView time2 = (TextView) item.findViewById(R.id.item_time2);
TextView num2 = (TextView) item.findViewById(R.id.item_num2);
onClickOrderCatBtn(btn2, logined, position, time2, num2);
break;
case R.id.item_btn3:
Button btn3 = (Button) item.findViewById(R.id.item_btn3);
TextView time3 = (TextView) item.findViewById(R.id.item_time3);
TextView num3 = (TextView) item.findViewById(R.id.item_num3);
onClickOrderCatBtn(btn3, logined, position, time3, num3);
break;
default:
break;
}
}
/**
* 点击预约按钮
*
* @param btn 按钮对象
* @param logined 标志着用户是否登录
* @param position item的位置
* @param time 显示约车时间的文本框
* @param num 显示可约数量的文本框
*/
public void onClickOrderCatBtn(Button btn, boolean logined, int position, TextView time, TextView num) {
if (logined) {
//用户已经登录
//开始预约,先判断是否可以预约,然后点击预约按钮,显示预约信息
ordernum = orderCars.get(position).schedule.ordernum;
if (Integer.parseInt(ordernum) > 0) {
String ordertime = time.getText().toString().trim();//练车时间
String orderdate = orderCars.get(position).orderdate;//预约日期
String carnumber = orderCars.get(position).carnumber;//练车的车号
String orderCarId = orderCars.get(position).id;//约车id
//可预约
showOrderCarDialog(btn, orderdate, ordertime, carnumber, orderCarId, num);
} else {
//不可预约,改变按钮的状态,并设置按钮不可点击
btn.setBackgroundResource(R.drawable.no_order_shape);
btn.setText("无车");
btn.setClickable(false);
btn.setFocusable(false);
}
} else {
//没有登录
DialogUtil.showDialog(mActivity, "请你先去登录系统...", false);
}
}
/**
* 显示预约练车对话框
* @param btn
* @param date 预约练车日期
* @param time 练车时刻表
* @param carnumber 预约车号
* @param orderCarId 预约id
* @param num 可约数量
*/
private void showOrderCarDialog(final Button btn, String date, String time,
String carnumber, final String orderCarId, final TextView num) {
AlertDialog.Builder builder = new AlertDialog.Builder(
mActivity);
final AlertDialog dialog = builder.create();
View view = View.inflate(mActivity, R.layout.dialog_orderable, null);
dialog.setView(view);
TextView tvOrderDate = (TextView) view.findViewById(R.id.tv_orderdate);
TextView tvTrainTime = (TextView) view.findViewById(R.id.tv_traintime);
TextView tvCarNumber = (TextView) view.findViewById(R.id.tv_carnumber);
Button btnOk = (Button) view.findViewById(R.id.btn_ok);
Button btnCancel = (Button) view.findViewById(R.id.btn_cancel);
tvOrderDate.setText(date);
tvTrainTime.setText(time);
tvCarNumber.setText(carnumber);
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
//点击取消按钮,不预约
btn.setBackgroundResource(R.drawable.ordered_shape);
btn.setText("约车");
}
});
btnOk.setOnClickListener(new View.OnClickListener() {
String studentId = SharedPreferencesUtil.getString(mActivity, "studentId", null);
@Override
public void onClick(View v) {
try {
String json = finishOrderCar(studentId, orderCarId);
System.out.println("json=" + json);
JSONObject jsonObject = new JSONObject(json);
ordernum = jsonObject.getString("orderCarNum");
String result = jsonObject.getString("result");
DialogUtil.showDialog(mActivity,
result, false);
dialog.dismiss();
//预约成功,更改按钮状态
btn.setBackgroundResource(R.drawable.has_order_shape);
btn.setText("已约");
btn.setClickable(false);
btn.setFocusable(false);
int new_ordernum = Integer.parseInt(ordernum);
if(new_ordernum<0){
new_ordernum = 0;
}
num.setText(String.valueOf(new_ordernum));
} catch (Exception e) {
e.printStackTrace();
DialogUtil.showDialog(mActivity,
"网络异常,请重试!", false);
}
}
});
dialog.show();
}
/**
* 点击确定,链接后台,完成约车功能
*/
protected String finishOrderCar(String studentId, String orderCarId)
throws Exception {
Map<String, String> map = new HashMap();
map.put("studentId", studentId);
map.put("orderCarId", orderCarId);
String url = GlobalVariables.BASE_URL + "android/ordercar?op=finishOrderCar";
return HttpUtil.postRequest(url, map);
}
}
运行效果:
这里只贴出了部分代码,还存在一个小小的bug,就是ListView中的按钮状态改变后,上下滑动ListView后,原先改变后的按钮状态恢复成原来的了,没有保持住按钮状态改变后的状态。