diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index f89b72eb29a..83b3a687695 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -66,7 +66,7 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di private boolean mPreferenceHighlighted = false; private Drawable mHighlightDrawable; - private Object mRegisterLock = new Object(); + private ListAdapter mCurrentRootAdapter; private boolean mIsDataSetObserverRegistered = false; private DataSetObserver mDataSetObserver = new DataSetObserver() { @Override @@ -146,6 +146,11 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di registerObserverIfNeeded(); } + @Override + protected void onUnbindPreferences() { + unregisterObserverIfNeeded(); + } + @Override public void onStop() { super.onStop(); @@ -154,20 +159,23 @@ public class SettingsPreferenceFragment extends PreferenceFragment implements Di } public void registerObserverIfNeeded() { - synchronized (mRegisterLock) { - if (!mIsDataSetObserverRegistered) { - getPreferenceScreen().getRootAdapter().registerDataSetObserver(mDataSetObserver); - mIsDataSetObserverRegistered = true; + if (!mIsDataSetObserverRegistered) { + if (mCurrentRootAdapter != null) { + mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver); } + mCurrentRootAdapter = getPreferenceScreen().getRootAdapter(); + mCurrentRootAdapter.registerDataSetObserver(mDataSetObserver); + mIsDataSetObserverRegistered = true; } } public void unregisterObserverIfNeeded() { - synchronized (mRegisterLock) { - if (mIsDataSetObserverRegistered) { - getPreferenceScreen().getRootAdapter().unregisterDataSetObserver(mDataSetObserver); - mIsDataSetObserverRegistered = false; + if (mIsDataSetObserverRegistered) { + if (mCurrentRootAdapter != null) { + mCurrentRootAdapter.unregisterDataSetObserver(mDataSetObserver); + mCurrentRootAdapter = null; } + mIsDataSetObserverRegistered = false; } }