Fixe the problem of invalid switch preference.

The source of this problem is that onBindViewHolder is called
after the user add the OnMainSwitchChangeListener. Then
preference gets a new MainSwitchBar in onBindViewHolder and
causes the listener to fail.

Bug: 223325900
Test: Manually test and observe the UI
Change-Id: I6e58c4cf035811bb8805e76bebb5fbb86c7a79da
This commit is contained in:
Stanley Wang
2022-04-27 17:17:21 +08:00
parent 17365c8e47
commit 10c9cf6cd5

View File

@@ -199,9 +199,10 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements
* Set the OnBeforeCheckedChangeListener. * Set the OnBeforeCheckedChangeListener.
*/ */
public void setOnBeforeCheckedChangeListener(OnBeforeCheckedChangeListener listener) { public void setOnBeforeCheckedChangeListener(OnBeforeCheckedChangeListener listener) {
if (mMainSwitchBar == null) { if (!mBeforeCheckedChangeListeners.contains(listener)) {
mBeforeCheckedChangeListeners.add(listener); mBeforeCheckedChangeListeners.add(listener);
} else { }
if (mMainSwitchBar != null) {
mMainSwitchBar.setOnBeforeCheckedChangeListener(listener); mMainSwitchBar.setOnBeforeCheckedChangeListener(listener);
} }
} }
@@ -210,9 +211,10 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements
* Adds a listener for switch changes * Adds a listener for switch changes
*/ */
public void addOnSwitchChangeListener(OnMainSwitchChangeListener listener) { public void addOnSwitchChangeListener(OnMainSwitchChangeListener listener) {
if (mMainSwitchBar == null) { if (!mSwitchChangeListeners.contains(listener)) {
mSwitchChangeListeners.add(listener); mSwitchChangeListeners.add(listener);
} else { }
if (mMainSwitchBar != null) {
mMainSwitchBar.addOnSwitchChangeListener(listener); mMainSwitchBar.addOnSwitchChangeListener(listener);
} }
} }
@@ -221,9 +223,8 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements
* Remove a listener for switch changes * Remove a listener for switch changes
*/ */
public void removeOnSwitchChangeListener(OnMainSwitchChangeListener listener) { public void removeOnSwitchChangeListener(OnMainSwitchChangeListener listener) {
if (mMainSwitchBar == null) { mSwitchChangeListeners.remove(listener);
mSwitchChangeListeners.remove(listener); if (mMainSwitchBar != null) {
} else {
mMainSwitchBar.removeOnSwitchChangeListener(listener); mMainSwitchBar.removeOnSwitchChangeListener(listener);
} }
} }