onCheckedChanged多次激活,Listview带复选框

use*_*755 8 android listview android-listview

我有一个带复选框的ListView:

  1. Oncheckedchanged(..) 用户在列表视图上选中/取消选中项目时调用
  2. 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;
 }
Run Code Online (Sandbox Code Playgroud)

编辑

onCheckedChanged()被调用

  1. 一旦没有选择任何项目并且用户单击该复选框
  2. 如果列表包含3个项目,并且当用户单击任何其他项目时,将调用onItemclick()并触发onCheckedChanged()3次(= no:列表视图中的项目)

kap*_*ani 15

将onCheckChangeListener替换为onClickListener.

checkChanged将被调用两次,因为当您调用setChecked()方法并单击复选框时将调用它.

  • 但是如果你在没有点击的情况下更改检查状态,就像使用简单的小拖动一样,这不会被调用.你可以检查自己. (4认同)

Aja*_*jay 10

我通过检查解决了这个问题:

    mSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
        if(buttonView.isPressed()){
            // do you operation
        });
        }
    });
Run Code Online (Sandbox Code Playgroud)

避免多次调用


jbo*_*boi 6

这是预期的行为:

  • onCheckedChanged(CompoundButton buttonView, boolean isChecked)每当检查/取消选中时,都会调用每个项目.Android已决定为您跟踪所有项目状态,并在每次更改时为您调用每个项目.使用该isChecked参数,您可以区分发生的情况.

  • onItemClick()只要其中一个项目被点击就会被调用 - 这不一定是项目中的复选框,而是某个地方.通常后来选择该项目 - 再次,并非总是如此.

  • 如果您需要知道列表视图中实际选择了哪个项目,请使用OnItemSelectedListener.onItemSelected().这是一个叫做获取选择的人(整个项目).

顺便说一句:您不需要手动编辑复选框的行为.选中/取消选中并在框中绘制勾选是由Android完成的.一旦知道选择了哪一个,您就需要获得检查状态.因此onCheckedChanged,就我所见,完全没有必要实施.