83

リサイクラービューにスイッチがあり、DB からデータを取得した後、リサイクラービューにデータが表示されます。recyclerview を開いたときに DB を読み取り、DB のフィールドが「Y」の場合はスイッチを有効にするか、スイッチを無効にします。問題はそれに伴い、onCheckedchanged リスナーも呼び出されます。ユーザーがスイッチを手動で設定した場合にのみ onCheckedChanged を呼び出す必要があります。

recyclerview を開くと、以下が実行されます。

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);
                     }
}

レイアウト ファイル内:

<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"/>
4

10 に答える 10

269

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

最も簡単なのは、次のことを確認することです。

buttonView.isPressed()

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

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

于 2015-01-29T16:13:51.897 に答える
14

この問題を回避するために、SwitchCompat のこのサブクラスを使用することになりました。このようにして、このクラスを使用している定型コードは必要ありません。リスナーを起動せずにチェックを変更する必要があるときはいつでも、setCheckedSilent代わりにsetChecked次を使用します。

import android.content.Context;
import android.os.Parcelable;
import android.support.v7.widget.SwitchCompat;
import android.util.AttributeSet;

/**
 * Created by emanuel on 30/5/16.
 */
public class Switch extends SwitchCompat {

    private OnCheckedChangeListener listener;

    public Switch(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
        this.listener = listener;
        super.setOnCheckedChangeListener(listener);
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        super.setOnCheckedChangeListener(null);
        super.onRestoreInstanceState(state);
        super.setOnCheckedChangeListener(listener);
    }

    public void setCheckedSilent(boolean checked) {
        super.setOnCheckedChangeListener(null);
        super.setChecked(checked);
        super.setOnCheckedChangeListener(listener);
    }
}

onRestoreInstanceStateonViewCreatedメソッドに設定されていて、前のフラグメントに戻る場合も、リスニングをトリガーしていました。それがあなたのために働くことを願っています!

于 2016-05-30T23:27:44.097 に答える
6

RecyclerViewはビューをリサイクルするため、新しい項目の にチェックされた値を設定すると、以前に添付されOnCheckedChangeListenerた がトリガーされる可能性があります。Switch

新しいデータをアイテムにバインドする場合:

   switch.setOnCheckedChangeListener(null) // remove any existing listener from recycled view
   switch.isChecked = [true/false] // will no longer trigger any callback to listener
   switch.setOnCheckedChangeListener { btnView, isChecked ->
       // do exiting stuff
   }
于 2021-01-15T19:57:03.783 に答える
2

これは私のために働く:

 boolean selected = preferences.isChecked();
        yourCheckBox.setOnCheckedChangeListener(new 
            CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, 
            boolean isChecked) {
                    if (buttonView.isPressed()) {
               preferences.setChecked(isChecked);
                    } else {
                        yourCheckBox.setChecked(selected);
                    }
                }
            });
于 2018-04-05T15:29:00.663 に答える
0

フラグメントの ViewPager 画面内で同じ問題に直面しました。フラグメントを切り替えると、onCheckedChanged Listener が何度も呼び出されます。

まだこの問題を探している人は、試してみてください。

@Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (buttonView.isInTouchMode()) {
              ... //Your code will come here.         
            }
}
于 2015-04-09T10:47:58.607 に答える
0

グローバルブール変数を使用し、DBからデータを読み取るときに「true」に設定し、onCheckChangeでチェック(if)した後、再度「false」に設定します。onCheckChange メソッドの最初に、この変数が false かどうかをチェックします。それ以外の場合は return(この変数のデフォルト値は false でなければなりません) ;

@Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     if(!isSourceDB){ 

       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);

          }
    }//end if
  isSourceDB = false; }// end oncheckedchange
于 2014-12-24T20:53:14.547 に答える