Fix a bug with bad view reuse.
There are many ways to fix this problem but this is the most direct way. Removing a view from the cache when any animation is started will ensure it won't be used again, and will be garbage collected when it's possible. Since views are created on demand anyway, a new one will just get created when needed, and that's it. Bug: 9400128 Change-Id: I4945d2859d642e79694d51ae90cf4f5bde9a5f1dmain
parent
b6f286bfa5
commit
6912342a48
|
@ -47,6 +47,7 @@ public class ButtonSwitcher extends FrameLayout {
|
||||||
private Button mInstallButton;
|
private Button mInstallButton;
|
||||||
private Button mCancelButton;
|
private Button mCancelButton;
|
||||||
private Button mDeleteButton;
|
private Button mDeleteButton;
|
||||||
|
private DictionaryListInterfaceState mInterfaceState;
|
||||||
private OnClickListener mOnClickListener;
|
private OnClickListener mOnClickListener;
|
||||||
|
|
||||||
public ButtonSwitcher(Context context, AttributeSet attrs) {
|
public ButtonSwitcher(Context context, AttributeSet attrs) {
|
||||||
|
@ -57,9 +58,10 @@ public class ButtonSwitcher extends FrameLayout {
|
||||||
super(context, attrs, defStyle);
|
super(context, attrs, defStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void reset() {
|
public void reset(final DictionaryListInterfaceState interfaceState) {
|
||||||
mStatus = NOT_INITIALIZED;
|
mStatus = NOT_INITIALIZED;
|
||||||
mAnimateToStatus = NOT_INITIALIZED;
|
mAnimateToStatus = NOT_INITIALIZED;
|
||||||
|
mInterfaceState = interfaceState;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -153,6 +155,7 @@ public class ButtonSwitcher extends FrameLayout {
|
||||||
private ViewPropertyAnimator animateButton(final View button, final int direction) {
|
private ViewPropertyAnimator animateButton(final View button, final int direction) {
|
||||||
final float outerX = getWidth();
|
final float outerX = getWidth();
|
||||||
final float innerX = button.getX() - button.getTranslationX();
|
final float innerX = button.getX() - button.getTranslationX();
|
||||||
|
mInterfaceState.removeFromCache((View)getParent());
|
||||||
if (ANIMATION_IN == direction) {
|
if (ANIMATION_IN == direction) {
|
||||||
button.setClickable(true);
|
button.setClickable(true);
|
||||||
return button.animate().translationX(0);
|
return button.animate().translationX(0);
|
||||||
|
|
|
@ -80,4 +80,8 @@ public class DictionaryListInterfaceState {
|
||||||
mViewCache.add(view);
|
mViewCache.add(view);
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeFromCache(final View view) {
|
||||||
|
mViewCache.remove(view);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -224,7 +224,7 @@ public final class WordListPreference extends Preference {
|
||||||
(ButtonSwitcher)view.findViewById(R.id.wordlist_button_switcher);
|
(ButtonSwitcher)view.findViewById(R.id.wordlist_button_switcher);
|
||||||
// We need to clear the state of the button switcher, because we reuse views; if we didn't
|
// We need to clear the state of the button switcher, because we reuse views; if we didn't
|
||||||
// reset it would animate from whatever its old state was.
|
// reset it would animate from whatever its old state was.
|
||||||
buttonSwitcher.reset();
|
buttonSwitcher.reset(mInterfaceState);
|
||||||
if (mInterfaceState.isOpen(mWordlistId)) {
|
if (mInterfaceState.isOpen(mWordlistId)) {
|
||||||
// The button is open.
|
// The button is open.
|
||||||
final int previousStatus = mInterfaceState.getStatus(mWordlistId);
|
final int previousStatus = mInterfaceState.getStatus(mWordlistId);
|
||||||
|
|
Loading…
Reference in New Issue