Merge "Create palette preview for color correction (2/n)."
diff --git a/src/com/android/settings/accessibility/PaletteListPreference.java b/src/com/android/settings/accessibility/PaletteListPreference.java
index c75da7f..de35112 100644
--- a/src/com/android/settings/accessibility/PaletteListPreference.java
+++ b/src/com/android/settings/accessibility/PaletteListPreference.java
@@ -31,6 +31,9 @@
 /** Preference that easier preview by matching name to color. */
 public class PaletteListPreference extends Preference {
 
+    private ListView mListView;
+    private ViewTreeObserver.OnPreDrawListener mPreDrawListener;
+
     /**
      * Constructs a new PaletteListPreference with the given context's theme and the supplied
      * attribute set.
@@ -58,6 +61,7 @@
     public PaletteListPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         setLayoutResource(R.layout.daltonizer_preview);
+        initPreDrawListener();
     }
 
     @Override
@@ -65,24 +69,39 @@
         super.onBindViewHolder(holder);
 
         final View rootView = holder.itemView;
-        final ListView listView = rootView.findViewById(R.id.palette_listView);
-        listView.getViewTreeObserver().addOnGlobalLayoutListener(
-                new ViewTreeObserver.OnGlobalLayoutListener() {
-                    @Override
-                    public void onGlobalLayout() {
-                        final int listViewHeight = listView.getMeasuredHeight();
-                        final int listViewWidth = listView.getMeasuredWidth();
-                        // Removes the callback after get result of measure view.
-                        listView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+        mListView = rootView.findViewById(R.id.palette_listView);
+        if (mPreDrawListener != null) {
+            mListView.getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
+        }
+    }
 
-                        // Resets layout parameters to display whole items from listView.
-                        final FrameLayout.LayoutParams layoutParams =
-                                (FrameLayout.LayoutParams) listView.getLayoutParams();
-                        layoutParams.height = listViewHeight * listView.getAdapter().getCount();
-                        layoutParams.width = listViewWidth;
-                        listView.setLayoutParams(layoutParams);
-                        listView.invalidateViews();
-                    }
-                });
+    private void initPreDrawListener() {
+        mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
+            @Override
+            public boolean onPreDraw() {
+                if (mListView == null) {
+                    return false;
+                }
+
+                final int listViewHeight = mListView.getMeasuredHeight();
+                final int listViewWidth = mListView.getMeasuredWidth();
+
+                // Removes the callback after get result of measure view.
+                final ViewTreeObserver viewTreeObserver = mListView.getViewTreeObserver();
+                if (viewTreeObserver.isAlive()) {
+                    viewTreeObserver.removeOnPreDrawListener(this);
+                }
+                mPreDrawListener = null;
+
+                // Resets layout parameters to display whole items from listView.
+                final FrameLayout.LayoutParams layoutParams =
+                        (FrameLayout.LayoutParams) mListView.getLayoutParams();
+                layoutParams.height = listViewHeight * mListView.getAdapter().getCount();
+                layoutParams.width = listViewWidth;
+                mListView.setLayoutParams(layoutParams);
+
+                return true;
+            }
+        };
     }
 }