Android中ListView适配器里区分不同按钮的点击事件

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后,原先改变后的按钮状态恢复成原来的了,没有保持住按钮状态改变后的状态。














  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上善若水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值