From 9416b2c7d6d927696f3ecd30096dd2e1349538a4 Mon Sep 17 00:00:00 2001 From: leticiars Date: Thu, 16 Dec 2021 17:01:22 -0500 Subject: [PATCH] [Divider] Added attribute in MaterialDividerItemDecoration to remove item decoration from last recycler view item. PiperOrigin-RevId: 416890397 --- docs/components/Divider.md | 27 ++++++++++++------ .../divider_itemdecoration_hiddendivider.png | Bin 0 -> 16310 bytes .../MaterialDividerItemDecoration.java | 27 +++++++++++++++++- .../divider/res-public/values/public.xml | 1 + .../material/divider/res/values/attrs.xml | 3 ++ .../MaterialDividerItemDecorationTest.java | 12 ++++++++ 6 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 docs/components/assets/dividers/divider_itemdecoration_hiddendivider.png diff --git a/docs/components/Divider.md b/docs/components/Divider.md index 2a06761a54b..c71090abfc6 100644 --- a/docs/components/Divider.md +++ b/docs/components/Divider.md @@ -83,7 +83,7 @@ to a `DividerItemDecoration`, that can be used as a divider between items of a A list with full-bleed dividers is displayed below: -![Vertical list of five items with gray dividers between each item](assets/dividers/divider_itemdecoration.png) +![Vertical list of five items with five gray dividers after each item](assets/dividers/divider_itemdecoration.png) In code: @@ -95,7 +95,7 @@ recyclerView.addItemDecoration(divider) By default, dividers will be full-bleed. To achieve the look of an inset or middle divider: -![Vertical list of five items with gray dividers that have a start inset](assets/dividers/divider_itemdecoration_inset.png) +![Vertical list of five items with five gray dividers that have a start inset](assets/dividers/divider_itemdecoration_inset.png) In code: @@ -104,6 +104,16 @@ divider.setDividerInsetStart(insetStart) divider.setDividerInsetEnd(insetEnd) ``` +Optionally, you can hide the last divider of a list: + +![Vertical list of five items with four gray dividers](assets/dividers/divider_itemdecoration_hiddendivider.png) + +In code: + +```kt +divider.setLastItemDecorated(false) +``` + ### Making dividers accessible The divider is a decorative element. There are no special accessibility @@ -113,12 +123,13 @@ precautions for the divider. ### Dividers attributes -Element | Attribute | Related method(s) | Default value ---------------- | ----------------------- | ------------------------------------------------------------------------------------ | ------------- -**Thickness** | `app:dividerThickness` | `setDividerThickness`
`setDividerThicknessResource`
`getDividerThickness` | `1dp` for the regular divider
`8dp` for the heavy divider -**Color** | `app:dividerColor` | `setDividerColor`
`setDividerColorResource`
`getDividerColor` | `colorOutline` -**Start inset** | `app:dividerInsetStart` | `setDividerInsetStart`
`setDividerInsetStartResource`
`getDividerInsetStart` | `0dp` -**End inset** | `app:dividerInsetEnd` | `setDividerInsetEnd`
`setDividerInsetEndResource`
`getDividerInsetEnd` | `0dp` +Element | Attribute | Related method(s) | Default value +----------------------- | ---------------------- | ------------------------------------------------------------------------------------ | ------------- +**Thickness** | `app:dividerThickness` | `setDividerThickness`
`setDividerThicknessResource`
`getDividerThickness` | `1dp` for the regular divider
`8dp` for the heavy divider +**Color** | `app:dividerColor` | `setDividerColor`
`setDividerColorResource`
`getDividerColor` | `colorOutline` +**Start inset** | `app:dividerInsetStart` | `setDividerInsetStart`
`setDividerInsetStartResource`
`getDividerInsetStart` | `0dp` +**End inset** | `app:dividerInsetEnd` | `setDividerInsetEnd`
`setDividerInsetEndResource`
`getDividerInsetEnd` | `0dp` +**Last item decorated** | `app:lastItemDecorated` | `setLastItemDecorated`
`isLastItemDecorated` | `true` ### Styles diff --git a/docs/components/assets/dividers/divider_itemdecoration_hiddendivider.png b/docs/components/assets/dividers/divider_itemdecoration_hiddendivider.png new file mode 100644 index 0000000000000000000000000000000000000000..4348f2d2eef538dca47a150e1b42e7b544a3ff20 GIT binary patch literal 16310 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 G2mL?gy`{|n literal 0 HcmV?d00001 diff --git a/lib/java/com/google/android/material/divider/MaterialDividerItemDecoration.java b/lib/java/com/google/android/material/divider/MaterialDividerItemDecoration.java index 7dca340d050..8aea0acdf97 100644 --- a/lib/java/com/google/android/material/divider/MaterialDividerItemDecoration.java +++ b/lib/java/com/google/android/material/divider/MaterialDividerItemDecoration.java @@ -66,6 +66,7 @@ public class MaterialDividerItemDecoration extends ItemDecoration { private int orientation; private int insetStart; private int insetEnd; + private boolean lastItemDecorated; private final Rect tempRect = new Rect(); @@ -95,6 +96,8 @@ public MaterialDividerItemDecoration( insetStart = attributes.getDimensionPixelOffset(R.styleable.MaterialDivider_dividerInsetStart, 0); insetEnd = attributes.getDimensionPixelOffset(R.styleable.MaterialDivider_dividerInsetEnd, 0); + lastItemDecorated = + attributes.getBoolean(R.styleable.MaterialDivider_lastItemDecorated, true); attributes.recycle(); @@ -259,6 +262,27 @@ public int getDividerInsetEnd() { return insetEnd; } + /** + * Sets whether the class should draw a divider after the last item of a {@link RecyclerView}. + * + * @param lastItemDecorated whether there's a divider after the last item of a recycler view. + * @see #isLastItemDecorated() + * @attr ref com.google.android.material.R.styleable#MaterialDivider_lastItemDecorated + */ + public void setLastItemDecorated(boolean lastItemDecorated) { + this.lastItemDecorated = lastItemDecorated; + } + + /** + * Whether there's a divider after the last item of a {@link RecyclerView}. + * + * @see #setLastItemDecorated(boolean) + * @attr ref com.google.android.material.R.styleable#MaterialDivider_shouldDecorateLastItem + */ + public boolean isLastItemDecorated() { + return lastItemDecorated; + } + @Override public void onDraw( @NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { @@ -294,7 +318,8 @@ private void drawForVerticalOrientation(@NonNull Canvas canvas, @NonNull Recycle right -= isRtl ? insetStart : insetEnd; int childCount = parent.getChildCount(); - for (int i = 0; i < childCount; i++) { + int dividerCount = lastItemDecorated ? childCount : childCount - 1; + for (int i = 0; i < dividerCount; i++) { View child = parent.getChildAt(i); parent.getDecoratedBoundsWithMargins(child, tempRect); // Take into consideration any translationY added to the view. diff --git a/lib/java/com/google/android/material/divider/res-public/values/public.xml b/lib/java/com/google/android/material/divider/res-public/values/public.xml index 9cd89621831..7ed45fbe344 100644 --- a/lib/java/com/google/android/material/divider/res-public/values/public.xml +++ b/lib/java/com/google/android/material/divider/res-public/values/public.xml @@ -20,6 +20,7 @@ + diff --git a/lib/java/com/google/android/material/divider/res/values/attrs.xml b/lib/java/com/google/android/material/divider/res/values/attrs.xml index d04fc76d083..15e117362ce 100644 --- a/lib/java/com/google/android/material/divider/res/values/attrs.xml +++ b/lib/java/com/google/android/material/divider/res/values/attrs.xml @@ -33,5 +33,8 @@ + + diff --git a/lib/javatests/com/google/android/material/divider/MaterialDividerItemDecorationTest.java b/lib/javatests/com/google/android/material/divider/MaterialDividerItemDecorationTest.java index 228a5dc7e5a..df036e65c01 100644 --- a/lib/javatests/com/google/android/material/divider/MaterialDividerItemDecorationTest.java +++ b/lib/javatests/com/google/android/material/divider/MaterialDividerItemDecorationTest.java @@ -127,6 +127,18 @@ public void setDividerInsetEndResource_succeeds() { assertThat(divider.getDividerInsetEnd()).isEqualTo(2); } + @Test + public void isLastItemDecorated_isTrueByDefault() { + assertThat(divider.isLastItemDecorated()).isTrue(); + } + + @Test + public void setLastItemNotDecorated_succeeds() { + divider.setLastItemDecorated(false); + + assertThat(divider.isLastItemDecorated()).isFalse(); + } + @Test public void getItemOffsets_verticalOrientation_returnsCorrectRect() { divider.getItemOffsets(rect, /* view= */ null, recyclerView, state);