Recyclerviewにスイッチがあり、DBからデータを取得した後、recyclerviewにデータが表示されます。 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"/>
私たち全員がこの問題を抱えているのは奇妙ですが、この単純な問題に対するGoogleの公式の回答ではありません。
最も簡単なのはチェックすることです:
buttonView.isPressed()
Trueの場合、ユーザーがビューをクリックしたことを意味します。
グローバル変数は必要ありません。
お役に立てれば。
この問題を回避するために、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);
}
}
onRestoreInstanceState
は、onViewCreated
メソッドで設定され、前のフラグメントに戻るときに、リスニングもトリガーしていました。それがあなたのために働くことを願っています!
これを試して
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isPressed()) {
... //returns true, if user clicks the switch button
}}
これは私のために働く:
<pre>
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);
}
}
});
<code>
フラグメントのViewPager画面内で同じ問題に直面しました。フラグメントを切り替えると、onCheckedChanged Listenerが何度も呼び出されます。
まだこの問題を探している人は、試してみてください。
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isInTouchMode()) {
... //Your code will come here.
}
}
グローバルブール変数を使用し、DBからデータを読み取るときに「true」に設定し、onCheckChangeのcheck(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