diff options
author | Doris Liu <tianliu@google.com> | 2015-06-25 22:43:12 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-06-25 22:43:14 +0000 |
commit | 9206d6a0e69ef0f60e20464796d4a2da6f7c42f4 (patch) | |
tree | 5da0bddd9f1a1e65bdb48181dfdafa261dbf788b | |
parent | 91617a793ed6a80f3abfd3653b0f74b9321fe0f6 (diff) | |
parent | ec6a4cdedab7faaf933dbbd86f7f74c7bd856baf (diff) | |
download | frameworks_base-9206d6a0e69ef0f60e20464796d4a2da6f7c42f4.zip frameworks_base-9206d6a0e69ef0f60e20464796d4a2da6f7c42f4.tar.gz frameworks_base-9206d6a0e69ef0f60e20464796d4a2da6f7c42f4.tar.bz2 |
Merge "Fix logic for whether beginning/end divider should be drawn" into mnc-dev
-rw-r--r-- | core/java/android/widget/LinearLayout.java | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index 056323d..4dcc242 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -359,7 +359,7 @@ public class LinearLayout extends ViewGroup { } if (hasDividerBeforeChildAt(count)) { - final View child = getVirtualChildAt(count - 1); + final View child = getLastNonGoneChild(); int bottom = 0; if (child == null) { bottom = getHeight() - getPaddingBottom() - mDividerHeight; @@ -371,6 +371,20 @@ public class LinearLayout extends ViewGroup { } } + /** + * Finds the last child that is not gone. The last child will be used as the reference for + * where the end divider should be drawn. + */ + private View getLastNonGoneChild() { + for (int i = getVirtualChildCount() - 1; i >= 0; i--) { + View child = getVirtualChildAt(i); + if (child != null && child.getVisibility() != GONE) { + return child; + } + } + return null; + } + void drawDividersHorizontal(Canvas canvas) { final int count = getVirtualChildCount(); final boolean isLayoutRtl = isLayoutRtl(); @@ -392,7 +406,7 @@ public class LinearLayout extends ViewGroup { } if (hasDividerBeforeChildAt(count)) { - final View child = getVirtualChildAt(count - 1); + final View child = getLastNonGoneChild(); int position; if (child == null) { if (isLayoutRtl) { @@ -627,21 +641,29 @@ public class LinearLayout extends ViewGroup { * @hide Pending API consideration. Currently only used internally by the system. */ protected boolean hasDividerBeforeChildAt(int childIndex) { - if (childIndex == 0) { - return (mShowDividers & SHOW_DIVIDER_BEGINNING) != 0; - } else if (childIndex == getChildCount()) { + if (childIndex == getVirtualChildCount()) { + // Check whether the end divider should draw. return (mShowDividers & SHOW_DIVIDER_END) != 0; - } else if ((mShowDividers & SHOW_DIVIDER_MIDDLE) != 0) { - boolean hasVisibleViewBefore = false; - for (int i = childIndex - 1; i >= 0; i--) { - if (getChildAt(i).getVisibility() != GONE) { - hasVisibleViewBefore = true; - break; - } + } + boolean allViewsAreGoneBefore = allViewsAreGoneBefore(childIndex); + if (allViewsAreGoneBefore) { + // This is the first view that's not gone, check if beginning divider is enabled. + return (mShowDividers & SHOW_DIVIDER_BEGINNING) != 0; + } else { + return (mShowDividers & SHOW_DIVIDER_MIDDLE) != 0; + } + } + + /** + * Checks whether all (virtual) child views before the given index are gone. + */ + private boolean allViewsAreGoneBefore(int childIndex) { + for (int i = childIndex - 1; i >= 0; i--) { + if (getVirtualChildAt(i).getVisibility() != GONE) { + return false; } - return hasVisibleViewBefore; } - return false; + return true; } /** |