4

我在布局中有一个带有复选框的自定义适配器。我可以在 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 更好吗?

PD:没有 ViewHolder 来简化代码

4

2 回答 2

3

在我看来,最好使用 setOnCheckedChangeListener。setOnClickListener 只会在你点击按钮的时候被调用,如果你改变复选框的状态而不点击,例如在你的代码中调用 setChecked(),setOnClickListener 不会被调用,但是 setOnCheckedChangeListener 会被调用。

于 2013-05-28T14:13:56.230 回答
0

当您同时设置setOnCheckedChangeListenersetOnClickListener事件时:

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

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

如果你在android:clickable="false"里面Switch,没有它就不行setOnClickListener,所以你可以添加这个空的监听器或删除android:clickable="false"

于 2021-06-17T08:07:13.143 回答