带CheckBox的Android自定义适配器:setOnClickListener或setOnCheckedChangeListener

时间:2013-05-28 14:01:34

标签: android checkbox android-arrayadapter

我在布局中有一个带Checkbox的自定义适配器。我可以在CheckBox上使用setOnClickListener而不会出现问题,或者更好地使用setOnCheckedChangeListener吗?

代码:

public class MyAdapter extends ArrayAdapter<Object> {
private Context context;
private LayoutInflater mInflater;
private boolean[] selected;

public MyAdaptader(Context context, List<Object> list) {
    super(context, 0, list);
    this.context = context;
    mInflater = LayoutInflater.from(context);
    selected = new boolean[list.size()];
}

private OnClickListener pressed= new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (((CheckBox) v).isChecked())
            selected[(Integer)v.getTag()] = true;
        else
            selected[(Integer)v.getTag()] = false;
    }
};

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.fila, null);
    }
    TextView txtName=convertView.findViewById(R.id.name);
    CheckBox chkSelected = (CheckBox) convertView.findViewById(R.id.selected);
    chkSelected.setTag(position);
    txtName.setText(getItem(position).toString());
    chkSelected.setChecked(selected[position]);
    chkSelected.setOnClickListener(pressed);
    return convertView;
}

}

我使用onClick并且似乎工作,但是更好的onCheckedListener?

P.D。:没有ViewHolder来简化代码

2 个答案:

答案 0 :(得分:3)

在我看来,最好使用setOnCheckedChangeListener。只有在单击按钮时才会调用setOnClickListener,如果更改复选框的状态而不单击,例如,在代码中调用setChecked(),将不会调用setOnClickListener,但会调用setOnCheckedChangeListener。

答案 1 :(得分:0)

当您同时设置 setOnCheckedChangeListenersetOnClickListener 事件时:

  1. 如果你滑动一个Switch,它会调用setOnCheckedChangeListener
  2. 如果您点击 Switch,它会调用 setOnCheckedChangeListenersetOnClickListener。在这种情况下,当第一个侦听器切换某个变量而第二个侦听器再次切换同一个变量时,您会得到一个奇怪的行为。

因此,最好在所有情况下都使用 setOnCheckedChangeListener

如果您在 android:clickable="false" 中有 Switch,没有 setOnClickListener 它将无法工作,因此您可以添加此空侦听器或删除 android:clickable="false"