onCheckedChanged多次激活,Listview带复选框

时间:2013-10-04 18:48:49

标签: android listview android-listview

我有一个带复选框的ListView:

    当用户在listview上检查/取消选中项目时,会调用
  1. Oncheckedchanged(..)
  2. 当用户通过OncheckedChanged(..) 点击listitem时,再次调用
  3. 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. 一旦没有选择任何项目,用户点击复选框
    2. 如果列表包含3个项目,并且当用户单击任何其他项目时,将调用onItemclick()并触发onCheckedChanged()3次(= no:列表视图中的项目)

3 个答案:

答案 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
        });
        }
    });

它避免了多次呼叫