我有一个带复选框的ListView:
Oncheckedchanged(..)
OncheckedChanged(..)
点击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()被称为
答案 0 :(得分:15)
将onCheckChangeListener替换为onClickListener。
checkChanged将被调用两次,因为当您调用setChecked()方法并单击复选框时将调用它。
答案 1 :(得分:6)
这是预期的行为:
onCheckedChanged(CompoundButton buttonView, boolean isChecked)
。 Android已决定为您跟踪所有项目状态,并在每次更改时为您调用每个项目。使用isChecked
参数,您可以区分发生的事情。
onItemClick()
- 这不一定是项目中的复选框,而是某个地方。通常后来选择该项目 - 再次,并非总是如此。
如果您需要知道列表视图中哪个项目实际上是已选择,请使用OnItemSelectedListener.onItemSelected()
。这是一个叫做选择的人(整个项目)。
BTW:您不需要手动编辑复选框的行为。方框中的勾选/取消选中和绘制是由Android完成的。一旦知道选择了哪一个,您就需要获得检查状态。因此,就我所见,onCheckedChanged
实现根本没有必要。
答案 2 :(得分:0)
我已经通过检查解决了此问题:
mSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
if(buttonView.isPressed()){
// do you operation
});
}
});
它避免了多次呼叫