summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoris Liu <tianliu@google.com>2015-06-25 15:16:54 -0700
committerDoris Liu <tianliu@google.com>2015-06-25 15:29:41 -0700
commitec6a4cdedab7faaf933dbbd86f7f74c7bd856baf (patch)
treedbd7e6cc0d376c85db654091786132974dea4ba2
parent728b7500b3d34cd89f7aff0bad1bb7fe3e097f11 (diff)
downloadframeworks_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.java50
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;
}
/**