onCheckedChanged多次触发ListView和checkbox

我有一个ListView与checkbox:

  1. Oncheckedchanged(..)在用户选中/取消选中listview项目时被调用
  2. 当用户通过onItemClick(.....)单击listitem时再次调用onItemClick(.....)

这是一个已知的问题? 如何区分事件。

 public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); convertView = inflator.inflate(R.layout.row, null); viewHolder = new ViewHolder(); viewHolder.text = (TextView) convertView.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); viewHolder.imageview= (ImageView) convertView.findViewById(R.id.imageView1); viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. } }); convertView.setTag(viewHolder); convertView.setTag(R.id.label, viewHolder.text); convertView.setTag(R.id.check, viewHolder.checkbox); convertView.setTag(R.id.imageView1, viewHolder.imageview); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.checkbox.setTag(position); // This line is important. viewHolder.imageview.setTag(position); viewHolder.text.setText(list.get(position).getName()); viewHolder.checkbox.setChecked(list.get(position).isSelected()); // change the default-image here if(list.get(position).getcontact_id()==5) { viewHolder.imageview.setImageResource(android.R.drawable.ic_dialog_map); }... .. return convertView; } 

编辑

onCheckedChanged()被调用

  1. 一旦没有select项目,用户点击checkbox
  2. 如果列表由3个项目组成,当用户点击任何其他项目时,onItemclick()被调用,onCheckedChanged()被激发3次(= no:listview中的项目)

  • 创build一个可扩展的RecyclerView
  • 具有ViewHolder模式的ListView中的远程图像
  • 无法将标题视图添加到列表 - 已调用setAdapter
  • 如何在按钮单击时动态删除ListView中的项目?
  • Android:是否可以刷新列表视图中的一个项目?
  • 为什么Google在Gmail应用对话列表视图中使用“canvas”?
  • 列表视图项目animation停止滚动
  • 滚动自定义ListView时,checkbox值会更改
  • 这是预期的行为:

    • onCheckedChanged(CompoundButton buttonView, boolean isChecked)被调用,每一个项目,只要他们检查/取消选中。 Android已决定为您追踪所有项目状态,并在每次更改时调用您的每个项目。 使用isChecked参数,您可以区分发生的情况。

    • onItemClick()在被点击的项目中被调用 – 不一定是项目内的checkbox,而是某处。 通常这个项目是事后select的,而不是一直。

    • 如果您需要知道从列表视图中select了哪个项目,请使用OnItemSelectedListener.onItemSelected() 。 这是所谓的select(整个项目)。

    顺便说一句:你不需要手动检查checkbox的行为。 在框中勾选/取消选中和绘图是由Android完成的。 一旦你知道select了哪一个,你只需要得到检查状态。 所以,就我onCheckedChanged实现并不是必须的。

    将onCheckChangeListenerreplace为onClickListener。

    checkChanged将被调用两次,因为当你调用setChecked()方法和当你点击checkbox时它将被调用。