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);
}
}
onRestoreInstanceState
onViewCreated
메서드에 설정되었을 때 청취를 트리거하고 이전 조각으로 돌아갑니다. 그것이 당신을 위해 작동하기를 바랍니다!
이 시도
@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
'Nice programing' 카테고리의 다른 글
* .mdf 파일을 데이터베이스로 연결할 수 없습니다. (0) | 2020.11.12 |
---|---|
Filezilla FTP 서버가 디렉토리 목록을 검색하지 못함 (0) | 2020.11.12 |
Xcode의 UITextField에 이미지를 추가 하시겠습니까? (0) | 2020.11.12 |
Ruby의 문자열에서 숫자 추출 (0) | 2020.11.12 |
git에서 특정 커밋을 가리키는 모든 태그를 나열하는 방법 (0) | 2020.11.12 |