Android列表动态绑定按钮点击事件

来源:互联网 发布:淘宝客服是干嘛的? 编辑:程序博客网 时间:2024/05/26 09:53

在自己接的项目中用到了一个功能,需要在Android的列表中绑定按钮,并且每个按钮根据每个item传递不同的参数。
ListView展现数据都是通过绑定一个Adapter来实现的,但是一般情况下,ListView中的点击事件都是固定的,最多是根据Item的position来确定是点击响应哪个事件,传递哪个参数。

之前代码是这样的

@Override    public View getView(int position, View convertView, ViewGroup parent) {             ViewHolder holder = new ViewHolder();        if(convertView==null) {            holder = new ViewHolder();            convertView = layoutInflater.inflate(R.layout.problem_checklist_item, null);                        holder.position1 = (TextView) convertView.findViewById(R.id.position1);            holder.position2 = (TextView) convertView.findViewById(R.id.position2);            holder.standardName = (TextView) convertView.findViewById(R.id.checkstandard);            holder.modifyBtn = (Button) convertView.findViewById(R.id.modify_btn);            HashMap<String,Object> map = data.get(position);        final String id = (String)map.get("id");        holder.modifyBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                // 修改检查结果                System.out.println("id--------------------->"+id);                RealCheckDBManager manager = new RealCheckDBManager(context);                String code = manager.getResultCode("优");                String deptId = manager.getDeptId(id);                String checkDate = manager.getCheckDate(id);                String checkNum = manager.getCheckNum(id);                manager.setDetailScore("", code, id);                String goodcode = manager.getResultCode("优");                String checkId = manager.getCheckId(id);                // 遍历Z_CHECK_SCORE_DETAIL表,查看是否都为OK,若是,这把Z_CHECK_SCORE的相应字段也置为OK                ArrayList<CheckScoreDetailInfo> detailList = manager.getCheckDetailList(checkId);                boolean isOk = true;                for(CheckScoreDetailInfo info : detailList) {                    if(!goodcode.equals(info.getCheckResult())) {                        isOk = false;                        break;                    }                }                if(isOk) {                    manager.setScore("", goodcode, checkId);                }                Toast.makeText(context, "修改成功!", Toast.LENGTH_LONG).show();                Intent intent = new Intent(context,RealCheckListActivity.class);                // 根据ID获取Z_CHECK_SCORE表的信息                intent.putExtra("deptId", deptId);                intent.putExtra("checkDate", checkDate);                intent.putExtra("checkNum", checkNum);                context.startActivity(intent);                RealCheckProblemListActivity activity = (RealCheckProblemListActivity)context;                activity.finish();            }        });            convertView.setTag(holder);        }else {            holder = (ViewHolder)convertView.getTag();        }               System.out.println("position----------------->"+position);        holder.position1.setText((String)data.get(position).get("dept1"));        holder.position2.setText((String)data.get(position).get("dept2"));        holder.standardName.setText((String)data.get(position).get("checkStandard"));        return convertView;    }

这样会带来一个问题,就是每次的id取值都不对,也就是每次点击button的时候,通过intent传递过去的参数都有问题,原因adapter的getview()方法,因为并不能确定什么时候会调用getView(),解决方法就是把对modifyBtn的绑定事件挪出来,放到convertView的代码段之外:

修改后的代码段

@Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = new ViewHolder();        if(convertView==null) {            holder = new ViewHolder();            convertView = layoutInflater.inflate(R.layout.problem_checklist_item, null);                        holder.position1 = (TextView) convertView.findViewById(R.id.position1);            holder.position2 = (TextView) convertView.findViewById(R.id.position2);            holder.standardName = (TextView) convertView.findViewById(R.id.checkstandard);            holder.modifyBtn = (Button) convertView.findViewById(R.id.modify_btn);            //data.get(position).get("");            convertView.setTag(holder);        }else {            holder = (ViewHolder)convertView.getTag();        }               System.out.println("position----------------->"+position);        holder.position1.setText((String)data.get(position).get("dept1"));        holder.position2.setText((String)data.get(position).get("dept2"));        holder.standardName.setText((String)data.get(position).get("checkStandard"));        HashMap<String,Object> map = data.get(position);        final String id = (String)map.get("id");        holder.modifyBtn.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                // 修改检查结果                System.out.println("id--------------------->"+id);                RealCheckDBManager manager = new RealCheckDBManager(context);                String code = manager.getResultCode("优");                String deptId = manager.getDeptId(id);                String checkDate = manager.getCheckDate(id);                String checkNum = manager.getCheckNum(id);                manager.setDetailScore("", code, id);                String goodcode = manager.getResultCode("优");                String checkId = manager.getCheckId(id);                // 遍历Z_CHECK_SCORE_DETAIL表,查看是否都为OK,若是,这把Z_CHECK_SCORE的相应字段也置为OK                ArrayList<CheckScoreDetailInfo> detailList = manager.getCheckDetailList(checkId);                boolean isOk = true;                for(CheckScoreDetailInfo info : detailList) {                    if(!goodcode.equals(info.getCheckResult())) {                        isOk = false;                        break;                    }                }                if(isOk) {                    manager.setScore("", goodcode, checkId);                }                Toast.makeText(context, "修改成功!", Toast.LENGTH_LONG).show();                Intent intent = new Intent(context,RealCheckListActivity.class);                // 根据ID获取Z_CHECK_SCORE表的信息                intent.putExtra("deptId", deptId);                intent.putExtra("checkDate", checkDate);                intent.putExtra("checkNum", checkNum);                context.startActivity(intent);                RealCheckProblemListActivity activity = (RealCheckProblemListActivity)context;                activity.finish();            }        });        return convertView;    }

这里还要注意一个问题,一旦在Item上绑定button的Onclick事件后,原先item的Onclick事件将会无效,因为button的Onclick事件已经将其“消化”。

0 0
原创粉丝点击