- 問題:
radioGroup.check(id)時,OnCheckedChangeListener被調(diào)用多次,2次3次都有
-原因:
radioGroup.check(id)的源碼如下
public void check(@IdRes int id) {
// don't even bother
if (id != -1 && (id == mCheckedId)) {
return;
}
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
if (id != -1) {
setCheckedStateForView(id, true);
}
setCheckedId(id);
}
setCheckedStateForView(id, boolean)會調(diào)用setCheckedId(id)
setCheckedId(id);源碼如下
if (mChecked != checked) {
mCheckedFromResource = false;
mChecked = checked;
refreshDrawableState();
notifyViewAccessibilityStateChangedIfNeeded(
AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
// Avoid infinite recursions if setChecked() is called from a listener
if (mBroadcasting) {
return;
}
mBroadcasting = true;
if (mOnCheckedChangeListener != null) {
//-----------注意這里調(diào)用了監(jiān)聽-----------------
mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
}
可以看出,原選中的radioButton有值,會被調(diào)一次mOnCheckedChangeListener,新選中的也會調(diào)一次,最后又會調(diào)一次。
所以會出現(xiàn)調(diào)用2次或3次的情況。
- 解決:
方法1.將radioGroup.check()替換成radioButton.setChecked(true)
方法2. 自己維護(hù)一個mCheckId,若監(jiān)聽回調(diào)這個checkId與mCheckId一致則不處理。若checkId的view選中狀態(tài)為false也不處理。