From 254fda565694a67af8cd7962dc3ca9bf2b8485c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Sousa?= Date: Sat, 9 Sep 2023 00:32:27 +0200 Subject: [PATCH 1/4] Fix max edge alignment when there are few items in the layout --- .../alignment/HorizontalAlignmentTest.kt | 13 +++++----- .../alignment/ParentAlignmentCalculator.kt | 16 ++++++++---- .../src/main/res/values/attrs.xml | 2 +- .../ParentAlignmentCalculatorTest.kt | 26 +++++++++++++++++++ .../layoutmanager/mock/LayoutManagerMock.kt | 2 ++ .../res/layout/horizontal_adapter_list.xml | 3 ++- 6 files changed, 49 insertions(+), 13 deletions(-) diff --git a/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/HorizontalAlignmentTest.kt b/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/HorizontalAlignmentTest.kt index d6e2005e..f6e7d47d 100644 --- a/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/HorizontalAlignmentTest.kt +++ b/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/HorizontalAlignmentTest.kt @@ -368,25 +368,26 @@ class HorizontalAlignmentTest : DpadRecyclerViewTest() { layoutConfiguration = getDefaultLayoutConfiguration().copy( parentAlignment = ParentAlignment( edge = Edge.MIN, - offset = 100, - fraction = 0f + offset = 0, + fraction = 0f, + preferKeylineOverEdge = true ), childAlignment = ChildAlignment( offset = 0, fraction = 0f ) ), - adapterConfiguration = getDefaultAdapterConfiguration().copy(numberOfItems = 5) + adapterConfiguration = getDefaultAdapterConfiguration().copy(numberOfItems = 4) ) - KeyEvents.pressRight(times = 4) + KeyEvents.pressRight(times = 3) waitForIdleScrollState() - val childBounds = getItemViewBounds(position = 4) + val childBounds = getItemViewBounds(position = 3) onRecyclerView("Request layout") { recyclerView -> recyclerView.requestLayout() } Espresso.onIdle() - assertThat(getItemViewBounds(position = 4)).isEqualTo(childBounds) + assertThat(getItemViewBounds(position = 3)).isEqualTo(childBounds) } @Test diff --git a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt index 8105a262..c78056d6 100644 --- a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt +++ b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt @@ -91,13 +91,15 @@ internal class ParentAlignmentCalculator { val keyLine = calculateKeyline(alignment) startScrollLimit = if (shouldAlignViewToStart(viewAnchor, keyLine, alignment)) { calculateScrollOffsetToStartEdge(edge) - } else { + } else if (startEdge <= getLayoutStartEdge() || alignment.preferKeylineOverEdge) { calculateScrollOffsetToKeyline(viewAnchor, keyLine) + } else { + 0 } } fun updateEndLimit(edge: Int, viewAnchor: Int, alignment: ParentAlignment) { - this.endEdge = edge + endEdge = edge if (isEndUnknown) { endScrollLimit = Int.MAX_VALUE return @@ -105,8 +107,10 @@ internal class ParentAlignmentCalculator { val keyline = calculateKeyline(alignment) endScrollLimit = if (shouldAlignViewToEnd(viewAnchor, keyline, alignment)) { calculateScrollOffsetToEndEdge(edge) - } else { + } else if (endEdge >= getLayoutEndEdge() || alignment.preferKeylineOverEdge) { calculateScrollOffsetToKeyline(viewAnchor, keyline) + } else { + 0 } } @@ -173,7 +177,8 @@ internal class ParentAlignmentCalculator { } if (alignment.preferKeylineOverEdge && isStartEdge(alignment.edge) - && (startEdge >= getLayoutStartEdge() && !isEndUnknown)) { + && (startEdge >= getLayoutStartEdge() && !isEndUnknown) + ) { return false } return viewAnchor + getLayoutStartEdge() <= startEdge + keyline @@ -189,7 +194,8 @@ internal class ParentAlignmentCalculator { } if (alignment.preferKeylineOverEdge && isEndEdge(alignment.edge) - && (endEdge <= getLayoutEndEdge() && !isStartUnknown)) { + && (endEdge <= getLayoutEndEdge() && !isStartUnknown) + ) { return false } return viewAnchor + getLayoutEndEdge() >= endEdge + keyline diff --git a/dpadrecyclerview/src/main/res/values/attrs.xml b/dpadrecyclerview/src/main/res/values/attrs.xml index c45c9a34..28a2a95d 100644 --- a/dpadrecyclerview/src/main/res/values/attrs.xml +++ b/dpadrecyclerview/src/main/res/values/attrs.xml @@ -21,7 +21,7 @@ - + diff --git a/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt b/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt index 25239f9a..ec5f52ff 100644 --- a/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt +++ b/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt @@ -328,6 +328,32 @@ class ParentAlignmentCalculatorTest { ).isEqualTo(distanceToKeyline) } + @Test + fun `end scroll limit should be zero when layout is not completely filled for max edge`() { + setLayoutProperties(orientation = RecyclerView.HORIZONTAL, reverseLayout = false) + + val alignment = ParentAlignment( + edge = ParentAlignment.Edge.MAX, + offset = 0, + fraction = 0f, + preferKeylineOverEdge = true + ) + + alignmentCalculator.updateStartLimit( + edge = 0, + viewAnchor = 0, + alignment = alignment + ) + + alignmentCalculator.updateEndLimit( + edge = horizontalViewWidth * 3, + viewAnchor = horizontalViewWidth, + alignment = alignment + ) + + assertThat(alignmentCalculator.endScrollLimit).isEqualTo(0) + } + private fun setLayoutProperties(orientation: Int, reverseLayout: Boolean) { if (orientation == RecyclerView.VERTICAL) { alignmentCalculator.updateLayoutInfo( diff --git a/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/mock/LayoutManagerMock.kt b/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/mock/LayoutManagerMock.kt index c86cc7a6..53fbb373 100644 --- a/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/mock/LayoutManagerMock.kt +++ b/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/mock/LayoutManagerMock.kt @@ -70,6 +70,8 @@ internal class LayoutManagerMock( }?.view } every { mock.paddingLeft }.answers { leftPadding } + every { mock.paddingStart }.answers { leftPadding } + every { mock.paddingEnd }.answers { rightPadding } every { mock.paddingTop }.answers { topPadding } every { mock.paddingRight }.answers { rightPadding } every { mock.paddingBottom }.answers { bottomPadding } diff --git a/sample/src/main/res/layout/horizontal_adapter_list.xml b/sample/src/main/res/layout/horizontal_adapter_list.xml index a8fd1cbc..5174fd48 100644 --- a/sample/src/main/res/layout/horizontal_adapter_list.xml +++ b/sample/src/main/res/layout/horizontal_adapter_list.xml @@ -32,7 +32,8 @@ app:dpadRecyclerViewFocusOutFront="false" app:dpadRecyclerViewParentAlignmentEdge="max" app:dpadRecyclerViewParentAlignmentFraction="0" - app:dpadRecyclerViewParentAlignmentOffset="@dimen/list_margin_start" /> + app:dpadRecyclerViewParentAlignmentOffset="@dimen/list_margin_start" + app:dpadRecyclerViewParentAlignmentPreferKeylineOverEdge="true" /> \ No newline at end of file From 12aa49b0ce761fee32d72627d1f9a44e5a73e65e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Sousa?= Date: Sun, 10 Sep 2023 00:00:32 +0200 Subject: [PATCH 2/4] Fill required space to ensure layout is aligned to the max edge --- .../tests/alignment/VerticalAlignmentTest.kt | 22 ++------ .../alignment/ParentAlignmentCalculator.kt | 53 +++++++++++++------ .../layoutmanager/layout/StructureEngineer.kt | 51 ++++++++++++++++-- .../ParentAlignmentCalculatorTest.kt | 2 +- .../screen/list/HorizontalListViewHolder.kt | 3 ++ .../res/layout/horizontal_adapter_list.xml | 3 +- 6 files changed, 92 insertions(+), 42 deletions(-) diff --git a/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/VerticalAlignmentTest.kt b/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/VerticalAlignmentTest.kt index a0085961..92db6323 100644 --- a/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/VerticalAlignmentTest.kt +++ b/dpadrecyclerview/src/androidTest/kotlin/com/rubensousa/dpadrecyclerview/test/tests/alignment/VerticalAlignmentTest.kt @@ -202,7 +202,8 @@ class VerticalAlignmentTest : DpadRecyclerViewTest() { ParentAlignment( edge = Edge.MAX, offset = 0, - fraction = 0.5f + fraction = 0.5f, + preferKeylineOverEdge = true ) ) @@ -360,28 +361,13 @@ class VerticalAlignmentTest : DpadRecyclerViewTest() { assertThat(viewBounds.centerY()).isEqualTo(getRecyclerViewBounds().centerY()) } - @Test - fun testLayoutAlignsToMaxEdgeWhenThereAreNotManyItems() { - val parentAlignment = ParentAlignment( - edge = Edge.MAX, - offset = 0, - fraction = 0.5f, - preferKeylineOverEdge = false - ) - launchFragment( - getDefaultLayoutConfiguration().copy(parentAlignment = parentAlignment), - getDefaultAdapterConfiguration().copy(numberOfItems = 3) - ) - val viewBounds = getItemViewBounds(position = 2) - assertThat(viewBounds.bottom).isEqualTo(getRecyclerViewBounds().bottom) - } - @Test fun testLayoutAlignsToKeylineInsteadOfMaxEdgeWhenThereAreNotManyItems() { val parentAlignment = ParentAlignment( edge = Edge.MAX, offset = 0, - fraction = 0.5f + fraction = 0.5f, + preferKeylineOverEdge = true ) launchFragment( getDefaultLayoutConfiguration().copy(parentAlignment = parentAlignment), diff --git a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt index c78056d6..1c72456f 100644 --- a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt +++ b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt @@ -82,7 +82,11 @@ internal class ParentAlignmentCalculator { endScrollLimit = Int.MAX_VALUE } - fun updateStartLimit(edge: Int, viewAnchor: Int, alignment: ParentAlignment) { + fun updateStartLimit( + edge: Int, + viewAnchor: Int, + alignment: ParentAlignment + ) { startEdge = edge if (isStartUnknown) { startScrollLimit = Int.MIN_VALUE @@ -91,14 +95,18 @@ internal class ParentAlignmentCalculator { val keyLine = calculateKeyline(alignment) startScrollLimit = if (shouldAlignViewToStart(viewAnchor, keyLine, alignment)) { calculateScrollOffsetToStartEdge(edge) - } else if (startEdge <= getLayoutStartEdge() || alignment.preferKeylineOverEdge) { + } else if (!isLayoutIncomplete() || alignment.preferKeylineOverEdge) { calculateScrollOffsetToKeyline(viewAnchor, keyLine) } else { 0 } } - fun updateEndLimit(edge: Int, viewAnchor: Int, alignment: ParentAlignment) { + fun updateEndLimit( + edge: Int, + viewAnchor: Int, + alignment: ParentAlignment, + ) { endEdge = edge if (isEndUnknown) { endScrollLimit = Int.MAX_VALUE @@ -107,7 +115,7 @@ internal class ParentAlignmentCalculator { val keyline = calculateKeyline(alignment) endScrollLimit = if (shouldAlignViewToEnd(viewAnchor, keyline, alignment)) { calculateScrollOffsetToEndEdge(edge) - } else if (endEdge >= getLayoutEndEdge() || alignment.preferKeylineOverEdge) { + } else if (!isLayoutComplete() || alignment.preferKeylineOverEdge) { calculateScrollOffsetToKeyline(viewAnchor, keyline) } else { 0 @@ -127,7 +135,10 @@ internal class ParentAlignmentCalculator { * Item will either be aligned to the keyline position or to either min or max edges * according to the current [alignment]. */ - fun calculateScrollOffset(viewAnchor: Int, alignment: ParentAlignment): Int { + fun calculateScrollOffset( + viewAnchor: Int, + alignment: ParentAlignment + ): Int { val keyline = calculateKeyline(alignment) val alignToStartEdge = shouldAlignViewToStart(viewAnchor, keyline, alignment) val alignToEndEdge = shouldAlignViewToEnd(viewAnchor, keyline, alignment) @@ -175,13 +186,10 @@ internal class ParentAlignmentCalculator { if (isStartUnknown || !shouldAlignToStartEdge(alignment.edge)) { return false } - if (alignment.preferKeylineOverEdge - && isStartEdge(alignment.edge) - && (startEdge >= getLayoutStartEdge() && !isEndUnknown) - ) { - return false + if (!isLayoutIncomplete()) { + return viewAnchor + getLayoutStartEdge() <= startEdge + keyline } - return viewAnchor + getLayoutStartEdge() <= startEdge + keyline + return isLayoutIncomplete() && !alignment.preferKeylineOverEdge } private fun shouldAlignViewToEnd( @@ -192,13 +200,10 @@ internal class ParentAlignmentCalculator { if (isEndUnknown || !shouldAlignToEndEdge(alignment.edge)) { return false } - if (alignment.preferKeylineOverEdge - && isEndEdge(alignment.edge) - && (endEdge <= getLayoutEndEdge() && !isStartUnknown) - ) { - return false + if (!isLayoutIncomplete()) { + return viewAnchor + getLayoutEndEdge() >= endEdge + keyline } - return viewAnchor + getLayoutEndEdge() >= endEdge + keyline + return isLayoutIncomplete() && !alignment.preferKeylineOverEdge } private fun calculateScrollOffsetToKeyline(anchor: Int, keyline: Int): Int { @@ -213,6 +218,20 @@ internal class ParentAlignmentCalculator { return paddingStart } + private fun isLayoutComplete(): Boolean { + return endEdge - startEdge >= size - paddingEnd - paddingStart + && endEdge <= size - paddingEnd + && startEdge >= paddingStart + } + + private fun isLayoutIncomplete(): Boolean { + return if (!reverseLayout) { + endEdge < size - paddingEnd + } else { + startEdge > paddingStart + } + } + private fun isStartEdge(edge: Edge): Boolean { return (!reverseLayout && edge == Edge.MIN) || (reverseLayout && edge == Edge.MAX) } diff --git a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt index 39ec13bb..9c7895a6 100644 --- a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt +++ b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt @@ -627,26 +627,69 @@ internal abstract class StructureEngineer( return true } } + /** + * Scenario: user selected a max edge alignment + * + * If both the start and end of the layout are inside the viewport + * and [ParentAlignment.preferKeylineOverEdge] is false, then fill the required space + * to collapse to the max edge. + */ if (edge == ParentAlignment.Edge.MAX) { if (!layoutRequest.reverseLayout && endEdge <= layoutInfo.getEndAfterPadding()) { if (startEdge >= layoutInfo.getStartAfterPadding() && preferKeylineOverEdge) { return false } - val distanceToEnd = layoutInfo.getEndAfterPadding() - endEdge - scrollBy(-distanceToEnd - remainingScroll, recycler, state, false) + fixEndGap(startEdge, endEdge, endView, remainingScroll, recycler, state) return true } else if (layoutRequest.reverseLayout && startEdge >= layoutInfo.getStartAfterPadding()) { if (endEdge <= layoutInfo.getEndAfterPadding() && preferKeylineOverEdge) { return false } - val distanceToStart = startEdge - layoutInfo.getStartAfterPadding() - scrollBy(distanceToStart - remainingScroll, recycler, state, false) + fixStartGap(startEdge, endEdge, endView, remainingScroll, recycler, state) return true } } return false } + private fun fixEndGap( + startEdge: Int, + endEdge: Int, + startView: View, + remainingScroll: Int, + recycler: RecyclerView.Recycler, + state: RecyclerView.State + ) { + val distanceToEndEdge = max(0, layoutInfo.getEndAfterPadding() - endEdge) + layoutRequest.prepend(layoutInfo.getLayoutPositionOf(startView)) { + setCheckpoint(startEdge) + setFillSpace(distanceToEndEdge) + } + val newStartSpace = fill(layoutRequest, recyclerViewProvider, recycler, state) + var scrollOffset = -newStartSpace + min(0, startEdge) // Include the start edge if negative + scrollOffset = max(-distanceToEndEdge, scrollOffset) + scrollBy(scrollOffset - remainingScroll, recycler, state, recycleChildren = false) + } + + private fun fixStartGap( + startEdge: Int, + endEdge: Int, + endView: View, + remainingScroll: Int, + recycler: RecyclerView.Recycler, + state: RecyclerView.State + ) { + val distanceToStart = max(0, startEdge - layoutInfo.getStartAfterPadding()) + layoutRequest.prepend(layoutInfo.getLayoutPositionOf(endView)) { + setCheckpoint(endEdge) + setFillSpace(distanceToStart) + } + val newEndSpace = fill(layoutRequest, recyclerViewProvider, recycler, state) + var scrollOffset = newEndSpace + max(0, endEdge - layoutInfo.getEndAfterPadding()) + scrollOffset = min(distanceToStart, scrollOffset) + scrollBy(scrollOffset - remainingScroll, recycler, state, recycleChildren = false) + } + protected fun addView(view: View, layoutRequest: LayoutRequest) { if (!layoutRequest.isLayingOutScrap) { if (layoutRequest.isAppending()) { diff --git a/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt b/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt index ec5f52ff..76bcaa4e 100644 --- a/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt +++ b/dpadrecyclerview/src/test/java/com/rubensousa/dpadrecyclerview/test/layoutmanager/alignment/ParentAlignmentCalculatorTest.kt @@ -347,7 +347,7 @@ class ParentAlignmentCalculatorTest { alignmentCalculator.updateEndLimit( edge = horizontalViewWidth * 3, - viewAnchor = horizontalViewWidth, + viewAnchor = 0, alignment = alignment ) diff --git a/sample/src/main/java/com/rubensousa/dpadrecyclerview/sample/ui/screen/list/HorizontalListViewHolder.kt b/sample/src/main/java/com/rubensousa/dpadrecyclerview/sample/ui/screen/list/HorizontalListViewHolder.kt index c57d3cbf..4a8f52ba 100644 --- a/sample/src/main/java/com/rubensousa/dpadrecyclerview/sample/ui/screen/list/HorizontalListViewHolder.kt +++ b/sample/src/main/java/com/rubensousa/dpadrecyclerview/sample/ui/screen/list/HorizontalListViewHolder.kt @@ -52,6 +52,9 @@ class HorizontalListViewHolder( DpadLinearSpacingDecoration.create( itemSpacing = itemView.resources.getDimensionPixelOffset( R.dimen.horizontal_item_spacing + ), + edgeSpacing = itemView.resources.getDimensionPixelOffset( + R.dimen.list_margin_start ) ) ) diff --git a/sample/src/main/res/layout/horizontal_adapter_list.xml b/sample/src/main/res/layout/horizontal_adapter_list.xml index 5174fd48..971aeba1 100644 --- a/sample/src/main/res/layout/horizontal_adapter_list.xml +++ b/sample/src/main/res/layout/horizontal_adapter_list.xml @@ -18,7 +18,6 @@ android:textSize="14sp" tools:text="Headline" /> - + app:dpadRecyclerViewParentAlignmentPreferKeylineOverEdge="false" /> \ No newline at end of file From 95bd1d1c3ae995e2f73e7dd308bcc9646ecaad95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Sousa?= Date: Sun, 10 Sep 2023 01:03:56 +0200 Subject: [PATCH 3/4] Fix max edge alignment for reverse layout --- .../layoutmanager/alignment/ParentAlignmentCalculator.kt | 3 +++ .../layoutmanager/layout/StructureEngineer.kt | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt index 1c72456f..278454b9 100644 --- a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt +++ b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/alignment/ParentAlignmentCalculator.kt @@ -225,6 +225,9 @@ internal class ParentAlignmentCalculator { } private fun isLayoutIncomplete(): Boolean { + if (isEndUnknown || isStartUnknown) { + return false + } return if (!reverseLayout) { endEdge < size - paddingEnd } else { diff --git a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt index 9c7895a6..4e2b4669 100644 --- a/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt +++ b/dpadrecyclerview/src/main/java/com/rubensousa/dpadrecyclerview/layoutmanager/layout/StructureEngineer.kt @@ -639,7 +639,7 @@ internal abstract class StructureEngineer( if (startEdge >= layoutInfo.getStartAfterPadding() && preferKeylineOverEdge) { return false } - fixEndGap(startEdge, endEdge, endView, remainingScroll, recycler, state) + fixEndGap(startEdge, endEdge, startView, remainingScroll, recycler, state) return true } else if (layoutRequest.reverseLayout && startEdge >= layoutInfo.getStartAfterPadding()) { if (endEdge <= layoutInfo.getEndAfterPadding() && preferKeylineOverEdge) { @@ -680,7 +680,7 @@ internal abstract class StructureEngineer( state: RecyclerView.State ) { val distanceToStart = max(0, startEdge - layoutInfo.getStartAfterPadding()) - layoutRequest.prepend(layoutInfo.getLayoutPositionOf(endView)) { + layoutRequest.append(layoutInfo.getLayoutPositionOf(endView)) { setCheckpoint(endEdge) setFillSpace(distanceToStart) } From 241daf384c22bc0145b9039e191d5d9c9e03c705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAben=20Sousa?= Date: Sun, 10 Sep 2023 01:07:05 +0200 Subject: [PATCH 4/4] Bump to 1.1.0-beta01 --- docs/changelog.md | 9 +++++++++ gradle.properties | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/changelog.md b/docs/changelog.md index e0d9e60e..6413faf5 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,6 +2,15 @@ ## Version 1.1.0 +### 1.1.0-beta01 + +2023-09-10 + +#### Bug fixes + +- Fixed wrong scrolling behavior when the layout isn't completely filled and `Edge.MAX` alignment is used: ([#160](https://github.com/rubensousa/DpadRecyclerView/issues/160)) +- Fixed XML attribute `app:dpadRecyclerViewParentAlignmentPreferKeylineOverEdge` not being applied correctly + ### 1.1.0-alpha03 2023-08-04 diff --git a/gradle.properties b/gradle.properties index 5ee65303..32744afa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,4 +22,4 @@ kotlin.code.style=official # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true android.enableR8.fullMode=true -LIBRARY_VERSION=1.1.0-alpha03 \ No newline at end of file +LIBRARY_VERSION=1.1.0-beta01 \ No newline at end of file