1. ホーム
  2. android

[解決済み] onCheckedChangedが自動的に呼び出される

2023-06-16 08:47:57

質問

リサイクルビューにスイッチを設置し、DBからデータを取得してリサイクルビューに表示させています。リサイクルビューが開かれたとき、私はDBを読み、DBのフィールドが"Y"であれば、私はスイッチを有効にし、さもなければスイッチを無効にします。 今問題なのは、それに伴ってonCheckedchangedリスナーも呼び出されることです。私は、ユーザーが手動でスイッチを設定したときだけonCheckedChangedが呼び出されるようにしたいのです。

リサイクルビューを開くと、以下のような処理が実行されます。

holder.enabledisable.setChecked(messengerRecord.get_is_valid().equalsIgnoreCase("Y"));

ViewHolderクラスです。

public class viewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener{
public SwitchCompat enabledisable;
 public viewHolder(View v) {
            enabledisable = (SwitchCompat) v.findViewById(R.id.enabledisable);
            enabledisable.setOnCheckedChangeListener(this);
...................................
...................................

recyclerViewが開かれたばかりの時に呼ばれるOncheckedChangedメソッドです。

@Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Log.v("ranjith","called oncheckedchanged");
            MessengerRecord rec;
            rec = dbHelper.getRecord(descview.getText().toString());
            switch (buttonView.getId()) {
                case R.id.enabledisable:
                    if (isChecked) {
                        rec.set_is_valid("Y");
                        dbHelper.updateRecord(rec);
                     }
}

Layoutファイルで

<android.support.v7.widget.SwitchCompat
    android:layout_marginRight="16dp"
    android:layout_marginEnd="16dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:id="@+id/enabledisable"
    android:layout_alignRight="@+id/textview_to"
    android:layout_alignEnd="@+id/textview_to"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"/>

どのように解決するのですか?

私たちの誰もがこの問題を抱えているのに、この単純な問題に対するGoogleの公式回答がないのは奇妙です。

最も簡単な方法は、チェックすることです。

buttonView.isPressed()

trueの場合、ユーザーがビューをクリックしたことを意味します。

グローバル変数は必要ありません。