Nice programing

onCheckedChanged가 자동으로 호출됩니다.

nicepro 2020. 11. 12. 20:11
반응형

onCheckedChanged가 자동으로 호출됩니다.


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

참이면 사용자가보기를 클릭했음을 의미합니다.

전역 변수가 필요하지 않습니다.

도움이 되었기를 바랍니다.


이 문제를 피하기 위해이 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메서드에 설정되었을 때 청취를 트리거하고 이전 조각으로 돌아갑니다. 그것이 당신을 위해 작동하기를 바랍니다!


이 시도

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

        if (buttonView.isPressed()) {
          ... //returns true, if user clicks the switch button        
        }}

전역 부울 변수를 사용하고 DB에서 데이터를 읽을 때 "true"로 설정하고 onCheckChange에서 check (if) 후에 다시 "false"로 설정합니다. onCheckChange 메소드의 첫 번째에서이 변수가 거짓인지 확인하십시오. 코드를 실행하십시오. else 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

I faced the same problem inside ViewPager screen for fragments. When we switch between fragments, onCheckedChanged Listener is called again and again.

If anyone still looking for this problem, please try it.

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

            if (buttonView.isInTouchMode()) {
              ... //Your code will come here.         
            }
}

This works for me:

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

참고URL : https://stackoverflow.com/questions/27641705/oncheckedchanged-called-automatically

반응형