diff options
author | Doris Liu <tianliu@google.com> | 2015-06-25 15:16:54 -0700 |
---|---|---|
committer | Doris Liu <tianliu@google.com> | 2015-06-25 15:29:41 -0700 |
commit | ec6a4cdedab7faaf933dbbd86f7f74c7bd856baf (patch) | |
tree | dbd7e6cc0d376c85db654091786132974dea4ba2 | |
parent | 728b7500b3d34cd89f7aff0bad1bb7fe3e097f11 (diff) | |
download | frameworks_base-ec6a4cdedab7faaf933dbbd86f7f74c7bd856baf.zip frameworks_base-ec6a4cdedab7faaf933dbbd86f7f74c7bd856baf.tar.gz frameworks_base-ec6a4cdedab7faaf933dbbd86f7f74c7bd856baf.tar.bz2 |
Fix logic for whether beginning/end divider should be drawn
Bug: 18945384
Change-Id: Ib8e785cb97d288e39a39b968bcb9c05410acbe34
-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; } /** |