8

ListViewアイテムにチェックボックスがある Androidがあります。

このチェックボックスはデフォルトでオンになっています。チェックを外したら、リストから削除する必要があります。

問題はonCheckedChanged、チェックボックスをタップしてチェックを外したとき(isChecked false)と、アイテムを削除した後( )の2回発生していることisChecked trueです。

これは、私の ArrayAdapter の関連コードです。

public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.item, parent, false);
        holder = new ViewHolder();
        holder.check = (CheckBox) convertView.findViewById(R.id.check);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    final Object item = this.getItem(position);
    holder.check.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (!isChecked) {
                remove(item); // This somehow calls onCheckedChanged again
            }
        }
    });
    return convertView;
}

私は何を間違っていますか?

4

3 に答える 3

6

私は同じ問題に遭遇しました.onCheckChangedメソッドの2回の実行はAndroidのバグのようです.

私の解決策:onClickListenerの代わりに を実装しonCheckedChangedListenerます。

このようなもの:

private final class CheckUpdateListener implements OnClickListener {

    private Group parent;
    private boolean isChecked;

    private CheckUpdateListener(Group parent) {

        this.parent = parent;

    }

    @Override
    public void onClick(View box) {
        this.isChecked = !parent.isChecked();

        parent.setChecked(isChecked);

        notifyDataSetChanged();

    }

}
于 2011-10-07T11:42:24.877 に答える
6

私は同様の問題を抱えていましたが、意図しOnCheckedChangeListenerた.

問題コード

holder.someCheckBox.setChecked(false);
holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
       ...
    }
});

リスナーを設定する前にチェックステータスを設定したことに注意してください。これは、リスナーが作成時に起動するのを防ぐためです。

ただし、アダプターの再作成が強制された後、またはnotifyDataSetChanged.

解決

ここでの作成時でも、チェック状態を設定するにリスナーをクリアします。

holder.someCheckBox.setOnCheckedChangeListener(null);
holder.someCheckBox.setChecked(false);
holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
       ...
    }
});

チェックボックスの初期値を設定するときに、残りのリスナーが起動されなくなりました。

于 2016-07-29T00:53:03.190 に答える
0

同じ問題が発生します。

いくつかの調査の後、setCheckChangeListener の RadioGroup に同様の動作があることがわかりました。

タグ付けは物事を台無しにします、バグのようです。

私の回避策は、リスナーの最後でタグを null に設定することでした。

private OnCheckedChangeListener checkBoxitemClickListener = new OnCheckedChangeListener() {

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


        if(isChecked)
        {               
            //do smth
        }else
        {
            //do smth
        }   

        buttonView.setTag(null);                        
    }
};

後で ListView を更新する必要がある場合は、アダプターで「notifyDataSetChanged」を呼び出すことを忘れないでください。

乾杯

于 2011-06-21T08:28:44.460 に答える