[解決済み] Android setOnCheckedChangeListenerは古いビューが戻ってきたときに再度呼び出されます。
2022-02-26 05:31:28
質問
getGroupView-methodで問題が解決できません。
問題は、リスナー setOnCheckedChangeListener が何度も呼び出されることです。
あるチェックボックスの項目にチェックを入れたとします。そして、それをスクロールして表示から外し、またスクロールして戻るとします。このとき、リスナーはもう一度呼び出されます。問題は、リスナーの内部でチェックボックスのIDを配列リストに保存して、後でそれを使うことです。その結果、リスナーが呼び出されるたびに配列リストに要素が追加され、データに歪みが生じています。
これに対する解決策はあるのでしょうか?例えば、リスナーの登録を解除すべきでしょうか?
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View view = null;
final int group_position = groupPosition;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.activity_phrase, parent, false);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.groupTitle);
viewHolder.checkBox = (CheckBox) view.findViewById(R.id.check);
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
if (buttonView.isChecked()) {
checked.add((Integer) viewHolder.checkBox.getTag());
}
else {
checked.remove((Integer) viewHolder.checkBox.getTag());
}
}
});
view.setTag(viewHolder);
viewHolder.checkBox.setTag(groupPosition);
} else {
view = convertView;
((ViewHolder)view.getTag()).checkBox.setTag(groupPosition);
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(titles[groupPosition]);
for (int i = 0; i < checked.size(); i++) {
if (checked.get(i) == group_position) {
holder.checkBox.setChecked(true);
}
else if (checked.get(i) != group_position) {
holder.checkBox.setChecked(false);
}
}
return view;
}
解決するには?
お使いのAndroidのバージョンは?
複数のコンポーネント、特にcheckedChange()メソッドを持つコンポーネント(CheckBox、RadioButton)で発生する問題のようで、その理由をうまく説明できないのですが、どうしたらよいでしょうか?
位置状態の変化を登録し、他のプロパティの変化を掴むからと推測しますが?似たような問題で こちら
いずれにせよ、これを回避する方法として
OnClickListener()
.
CheckBox yourCheckBox = (CheckBox) findViewById (R.id.yourId);
yourCheckBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//is chkIos checked?
if (((CheckBox) v).isChecked()) {
//Case 1
}
else
//case 2
}
});
関連
-
[解決済み】Android - SDKバージョン23のアップデート後、ACTION-VIEWインテントフィルタを持つアクティビティを少なくとも1つ追加する。
-
[解決済み】コンテンツには、id属性が「android.R.id.list」であるListViewが必要です。
-
[解決済み】シンボル 'AppCompatActivity' を解決できない。
-
[解決済み】findViewByIDがnullを返す。
-
[解決済み】Android "ビュー階層を作成した元のスレッドだけが、そのビューに触れることができる"
-
[解決済み] AndroidでBluetoothが有効かどうかのチェックに失敗する(REQUEST_ENABLE_BTを変数に解決できない)。
-
[解決済み] Android: @drawable/picture を drawable に変換するのに失敗しました。
-
[解決済み] Androidです。前のアクティビティに戻る
-
[解決済み] AndroidのEditTextビューで複数行を許可しますか?
-
[解決済み] AndroidでSQLiteを使用する際に、並行処理の問題を回避するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android - SDKバージョン23のアップデート後、ACTION-VIEWインテントフィルタを持つアクティビティを少なくとも1つ追加する。
-
[解決済み】react-native: コマンドが見つかりません。
-
[解決済み】Android Intent コンストラクタを解決できない
-
[解決済み】インストールエラー。インストールエラー:install_failed_older_sdk
-
[解決済み】onCreateOptionsMenu(Menu メニュー)とは何ですか?)
-
[解決済み] TypeError: cb.apply は関数ではありません。
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] com.android.supportのライブラリは全て全く同じバージョン表記である必要があります。
-
[解決済み] Android: @drawable/picture を drawable に変換するのに失敗しました。
-
[解決済み] チェックボックスの値をonCheckChangedをトリガーにせずに変更する