我有一个带复选框的ListView:

当用户在 ListView 中选中/取消选中项目时,调用

  • Oncheckedchanged(..)
  • 用户通过OncheckedChanged(..)单击列表项时再次调用
  • 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()被调用
  • 一旦未选择任何项目并且用户单击复选框
  • 如果列表包含3个项目,并且当用户单击任何其他项目时,将调用onItemclick()并触发onCheckedChanged()3次(= no: ListView 中的项目)

    最佳答案

    这是预期的行为:

    选中或取消选中每个项目时,就会调用

  • onCheckedChanged(CompoundButton buttonView, boolean isChecked)。 Android已决定为您跟踪所有商品的状态,并在每次更改时都致电给您。使用isChecked参数,您可以区分发生了什么。
  • 每当单击其中一项时,即会调用
  • onItemClick()-不一定是该项中的复选框,而是某处。通常,此后选择该项目-再次,并非总是如此。
  • 如果您需要知道从 ListView 中选择了实际上是的项目,请使用OnItemSelectedListener.onItemSelected()。这是用来获取选择(整个商品)的商品。

  • 顺便说一句:您不需要手动执行复选框的行为。复选框中的勾号的选中/取消选中和绘制是由Android完成的。一旦知道选择了哪个状态,您只需要获取检查状态。因此,据我所知,根本不需要onCheckedChanged实现。

    10-05 17:45