Skip to content

[Android] Fix RemainingItemsThresholdReachedCommand not firing when CollectionView has Header and Footer both defined#29618

Merged
kubaflo merged 13 commits intodotnet:inflight/currentfrom
SuthiYuvaraj:fix-29588
Feb 23, 2026
Merged

[Android] Fix RemainingItemsThresholdReachedCommand not firing when CollectionView has Header and Footer both defined#29618
kubaflo merged 13 commits intodotnet:inflight/currentfrom
SuthiYuvaraj:fix-29588

Conversation

@SuthiYuvaraj
Copy link
Copy Markdown
Contributor

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

Issue Description

In Android, the RemainingThresholdReached command is not triggered when both a Header and a Footer are defined for the collection.

RootCause

The SendRemainingThresholdReached method is triggered based on the LastVisibleIndex and the ItemCount provided by the ItemAdapter. However, on Android, when both a Header and a Footer are defined, the ItemCount consider it, leading to incorrect triggering logic.

Description of Change

Updated the logic to ensure that the ItemCount correctly includes both the Header and Footer. This change ensures that the Footer becomes visible as expected and that the SendRemainingThresholdReached command is properly executed.

Issues Fixed

Fixes #29588

Tested the behaviour in the following platforms

  • Android
  • Windows
  • iOS
  • Mac

Output Screenshot

Before Issue Fix After Issue Fix
RemainingThresholdBefore.mov
RemainingThresholdAfter.mov

@dotnet-policy-service dotnet-policy-service bot added community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration labels May 22, 2025
@jsuarezruiz jsuarezruiz added the area-controls-collectionview CollectionView, CarouselView, IndicatorView label May 22, 2025
@jsuarezruiz
Copy link
Copy Markdown
Contributor

/azp run MAUI-UITests-public

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

bool hasHeader = ItemsViewAdapter.ItemsSource.HasHeader;
bool hasFooter = ItemsViewAdapter.ItemsSource.HasFooter;

int firstDataItemIndex = (hasHeader && hasFooter) ? 1 : 0;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the changes, firstDataItemIndex is set to 1 only when both Header and Footer exist. However, if only Header is present, the value should be 1 too, right?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes @jsuarezruiz , firstDataItemIndex should be set to 1 whenever only the header is present. Since the header and footer affect indexing independently, they should be evaluated separately.

I've updated the logic to reflect this and optimized the code for improved clarity and efficiency. Please review the modified fix and let me know if any further changes are required.

return;
}

switch (_itemsView.RemainingItemsThreshold)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, could simplify the logic by consolidating checks:

bool isThresholdReached = (Last == lastDataItemIndex - 1) || (lastDataItemIndex - 1 - Last <= _itemsView.RemainingItemsThreshold);

if (isThresholdReached)
{
    _itemsView.SendRemainingItemsThresholdReached();
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jsuarezruiz , I've optimized the logic for improved clarity and efficiency. Please review the modified fix and let me know if any further changes are required.

using System.Windows.Input;
using Microsoft.Maui.Controls;

namespace Microsoft.Maui.Controls.Issues
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super nit: File-scope namespace can be used here.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MartyIX , Thanks for the feedback , I have updated the code changes, let me know if any further changes are required.

@SuthiYuvaraj SuthiYuvaraj marked this pull request as ready for review May 27, 2025 14:23
@SuthiYuvaraj SuthiYuvaraj requested a review from a team as a code owner May 27, 2025 14:23
@jsuarezruiz
Copy link
Copy Markdown
Contributor

/azp run MAUI-UITests-public

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

Copilot AI review requested due to automatic review settings December 8, 2025 06:34
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes a bug where the RemainingItemsThresholdReachedCommand fails to fire in Android CollectionView when both a Header and Footer are defined. The root cause is that the threshold calculation didn't properly account for both header and footer items being included in the adapter's ItemCount, leading to incorrect triggering logic.

Key Changes:

  • Updated threshold calculation logic in RecyclerViewScrollListener.cs to correctly subtract header and footer counts from ItemCount
  • Consolidated multiple switch/case branches into a single boolean expression for cleaner code
  • Added comprehensive UI test to verify the fix works with header and footer present

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
src/Controls/src/Core/Handlers/Items/Android/RecyclerViewScrollListener.cs Refactored threshold reached logic to properly calculate item count excluding headers/footers, and simplified control flow from switch statement to boolean expression
src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29588.cs Added NUnit UI test that scrolls CollectionView and verifies threshold command triggers
src/Controls/tests/TestCases.HostApp/Issues/Issue29588.cs Added test page with 20 initial items, header, footer, and async command that updates label when threshold reached


int modifiedItemCount = ItemsViewAdapter.ItemCount - footerValue - headerValue;

if (Last < headerValue || Last > modifiedItemCount)
Copy link

Copilot AI Dec 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The boundary check Last > modifiedItemCount should be Last >= modifiedItemCount. If there are 20 items (indices 0-19), modifiedItemCount would be 20, and a Last value of 20 would be invalid but would not be caught by this check. Valid item indices range from 0 to modifiedItemCount - 1, so any index >= modifiedItemCount should return early.

Suggested change
if (Last < headerValue || Last > modifiedItemCount)
if (Last < headerValue || Last >= modifiedItemCount)

Copilot uses AI. Check for mistakes.

internal class Issue29588 : _IssuesUITest
{
public override string Issue => "CollectionView RemainingItemsThresholdReachedcommand should trigger on scroll near end";
Copy link

Copilot AI Dec 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in the Issue description: "RemainingItemsThresholdReachedcommand" should have a space before "command".

Suggested change
public override string Issue => "CollectionView RemainingItemsThresholdReachedcommand should trigger on scroll near end";
public override string Issue => "CollectionView RemainingItemsThresholdReached command should trigger on scroll near end";

Copilot uses AI. Check for mistakes.

namespace Microsoft.Maui.Controls.Issues;

[Issue(IssueTracker.Github, 29588, "CollectionView RemainingItemsThresholdReachedcommand should trigger on scroll near end", PlatformAffected.Android)]
Copy link

Copilot AI Dec 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in the Issue description: "RemainingItemsThresholdReachedcommand" should have a space before "command".

Suggested change
[Issue(IssueTracker.Github, 29588, "CollectionView RemainingItemsThresholdReachedcommand should trigger on scroll near end", PlatformAffected.Android)]
[Issue(IssueTracker.Github, 29588, "CollectionView RemainingItemsThresholdReached command should trigger on scroll near end", PlatformAffected.Android)]

Copilot uses AI. Check for mistakes.
App.ScrollDown("29588CollectionView", ScrollStrategy.Gesture, 0.8, 500);
}
App.WaitForElement("29588ThresholdLabel");
Assert.That(App.FindElement("29588ThresholdLabel").GetText(), Is.EqualTo("Threshold reached"));
Copy link

Copilot AI Dec 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Potential race condition: The RemainingItemReachedCommand is async and includes a 1.5 second delay (Task.Delay(1500) in LoadMoreItemsAsync()), but the test immediately checks the label text after scrolling. The assertion on line 25 might execute before ThresholdStatus is updated to "Threshold reached". Consider adding a wait/polling mechanism after the scrolling to ensure the async command completes, or use a framework method that waits for the text to change to the expected value.

Suggested change
Assert.That(App.FindElement("29588ThresholdLabel").GetText(), Is.EqualTo("Threshold reached"));
// Wait up to 5 seconds for the label text to become "Threshold reached"
const int timeoutMs = 5000;
const int pollIntervalMs = 200;
var start = DateTime.UtcNow;
string labelText = "";
do
{
labelText = App.FindElement("29588ThresholdLabel").GetText();
if (labelText == "Threshold reached")
break;
System.Threading.Thread.Sleep(pollIntervalMs);
}
while ((DateTime.UtcNow - start).TotalMilliseconds < timeoutMs);
Assert.That(labelText, Is.EqualTo("Threshold reached"));

Copilot uses AI. Check for mistakes.
@rmarinho rmarinho added s/agent-approved AI agent recommends approval - PR fix is correct and optimal s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-fix-lose Author adopted the agent's fix and it turned out to be bad s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Feb 15, 2026
kubaflo
kubaflo previously approved these changes Feb 15, 2026
@kubaflo
Copy link
Copy Markdown
Contributor

kubaflo commented Feb 15, 2026

Hi @SuthiYuvaraj looks good! Can you have a look at the AI Summary and check if it makes sense to you :)

@SuthiYuvaraj SuthiYuvaraj changed the title Fix RemainingItemsThresholdReachedCommand not firing when CollectionVew has Header and Footer both defined [Android] Fix RemainingItemsThresholdReachedCommand not firing when CollectionView has Header and Footer both defined Feb 16, 2026
@sheiksyedm
Copy link
Copy Markdown
Contributor

/azp run maui-pr-uitests , maui-pr-devicetests

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 2 pipeline(s).

@kubaflo kubaflo added the s/agent-suggestions-implemented Maintainer applies when PR author adopts agent's recommendation label Feb 16, 2026
@kubaflo kubaflo added s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates and removed s/agent-fix-lose Author adopted the agent's fix and it turned out to be bad labels Feb 20, 2026
@kubaflo kubaflo changed the base branch from main to inflight/current February 23, 2026 13:45
@kubaflo kubaflo merged commit ff40347 into dotnet:inflight/current Feb 23, 2026
145 of 164 checks passed
github-actions bot pushed a commit that referenced this pull request Feb 24, 2026
…ollectionView has Header and Footer both defined (#29618)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Issue Description
In Android, the `RemainingThresholdReached` command is not triggered
when both a `Header` and a `Footer` are defined for the collection.

### RootCause 
The `SendRemainingThresholdReached` method is triggered based on the
`LastVisibleIndex` and the `ItemCount` provided by the ItemAdapter.
However, on Android, when both a Header and a Footer are defined, the
ItemCount consider it, leading to incorrect triggering logic.
 
### Description of Change
Updated the logic to ensure that the ItemCount correctly includes both
the Header and Footer. This change ensures that the Footer becomes
visible as expected and that the SendRemainingThresholdReached command
is properly executed.

### Issues Fixed
Fixes #29588 

### Tested the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac


### Output Screenshot
Before Issue Fix | After Issue Fix |
|----------|----------|
|<video width="40" height="60" alt="Before Fix"
src="https://github.com/user-attachments/assets/919c566b-c5f4-431f-9498-2b7f254e73d9">|<video
width="50" height="40" alt="After Fix"
src="https://github.com/user-attachments/assets/ad7490d5-410c-43a8-b4bd-8702a2bfc48f">|

---------

Co-authored-by: MartyIX <203266+MartyIX@users.noreply.github.com>
jfversluis pushed a commit that referenced this pull request Mar 2, 2026
…ollectionView has Header and Footer both defined (#29618)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Issue Description
In Android, the `RemainingThresholdReached` command is not triggered
when both a `Header` and a `Footer` are defined for the collection.

### RootCause 
The `SendRemainingThresholdReached` method is triggered based on the
`LastVisibleIndex` and the `ItemCount` provided by the ItemAdapter.
However, on Android, when both a Header and a Footer are defined, the
ItemCount consider it, leading to incorrect triggering logic.
 
### Description of Change
Updated the logic to ensure that the ItemCount correctly includes both
the Header and Footer. This change ensures that the Footer becomes
visible as expected and that the SendRemainingThresholdReached command
is properly executed.

### Issues Fixed
Fixes #29588 

### Tested the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac


### Output Screenshot
Before Issue Fix | After Issue Fix |
|----------|----------|
|<video width="40" height="60" alt="Before Fix"
src="https://github.com/user-attachments/assets/919c566b-c5f4-431f-9498-2b7f254e73d9">|<video
width="50" height="40" alt="After Fix"
src="https://github.com/user-attachments/assets/ad7490d5-410c-43a8-b4bd-8702a2bfc48f">|

---------

Co-authored-by: MartyIX <203266+MartyIX@users.noreply.github.com>
jfversluis pushed a commit that referenced this pull request Mar 2, 2026
…ollectionView has Header and Footer both defined (#29618)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Issue Description
In Android, the `RemainingThresholdReached` command is not triggered
when both a `Header` and a `Footer` are defined for the collection.

### RootCause 
The `SendRemainingThresholdReached` method is triggered based on the
`LastVisibleIndex` and the `ItemCount` provided by the ItemAdapter.
However, on Android, when both a Header and a Footer are defined, the
ItemCount consider it, leading to incorrect triggering logic.
 
### Description of Change
Updated the logic to ensure that the ItemCount correctly includes both
the Header and Footer. This change ensures that the Footer becomes
visible as expected and that the SendRemainingThresholdReached command
is properly executed.

### Issues Fixed
Fixes #29588 

### Tested the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac


### Output Screenshot
Before Issue Fix | After Issue Fix |
|----------|----------|
|<video width="40" height="60" alt="Before Fix"
src="https://github.com/user-attachments/assets/919c566b-c5f4-431f-9498-2b7f254e73d9">|<video
width="50" height="40" alt="After Fix"
src="https://github.com/user-attachments/assets/ad7490d5-410c-43a8-b4bd-8702a2bfc48f">|

---------

Co-authored-by: MartyIX <203266+MartyIX@users.noreply.github.com>
github-actions bot pushed a commit that referenced this pull request Mar 3, 2026
…ollectionView has Header and Footer both defined (#29618)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Issue Description
In Android, the `RemainingThresholdReached` command is not triggered
when both a `Header` and a `Footer` are defined for the collection.

### RootCause 
The `SendRemainingThresholdReached` method is triggered based on the
`LastVisibleIndex` and the `ItemCount` provided by the ItemAdapter.
However, on Android, when both a Header and a Footer are defined, the
ItemCount consider it, leading to incorrect triggering logic.
 
### Description of Change
Updated the logic to ensure that the ItemCount correctly includes both
the Header and Footer. This change ensures that the Footer becomes
visible as expected and that the SendRemainingThresholdReached command
is properly executed.

### Issues Fixed
Fixes #29588 

### Tested the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac


### Output Screenshot
Before Issue Fix | After Issue Fix |
|----------|----------|
|<video width="40" height="60" alt="Before Fix"
src="https://github.com/user-attachments/assets/919c566b-c5f4-431f-9498-2b7f254e73d9">|<video
width="50" height="40" alt="After Fix"
src="https://github.com/user-attachments/assets/ad7490d5-410c-43a8-b4bd-8702a2bfc48f">|

---------

Co-authored-by: MartyIX <203266+MartyIX@users.noreply.github.com>
HarishKumarSF4517 pushed a commit to HarishKumarSF4517/maui that referenced this pull request Mar 5, 2026
…ollectionView has Header and Footer both defined (dotnet#29618)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Issue Description
In Android, the `RemainingThresholdReached` command is not triggered
when both a `Header` and a `Footer` are defined for the collection.

### RootCause 
The `SendRemainingThresholdReached` method is triggered based on the
`LastVisibleIndex` and the `ItemCount` provided by the ItemAdapter.
However, on Android, when both a Header and a Footer are defined, the
ItemCount consider it, leading to incorrect triggering logic.
 
### Description of Change
Updated the logic to ensure that the ItemCount correctly includes both
the Header and Footer. This change ensures that the Footer becomes
visible as expected and that the SendRemainingThresholdReached command
is properly executed.

### Issues Fixed
Fixes dotnet#29588 

### Tested the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac


### Output Screenshot
Before Issue Fix | After Issue Fix |
|----------|----------|
|<video width="40" height="60" alt="Before Fix"
src="https://github.com/user-attachments/assets/919c566b-c5f4-431f-9498-2b7f254e73d9">|<video
width="50" height="40" alt="After Fix"
src="https://github.com/user-attachments/assets/ad7490d5-410c-43a8-b4bd-8702a2bfc48f">|

---------

Co-authored-by: MartyIX <203266+MartyIX@users.noreply.github.com>
github-actions bot pushed a commit that referenced this pull request Mar 6, 2026
…ollectionView has Header and Footer both defined (#29618)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Issue Description
In Android, the `RemainingThresholdReached` command is not triggered
when both a `Header` and a `Footer` are defined for the collection.

### RootCause 
The `SendRemainingThresholdReached` method is triggered based on the
`LastVisibleIndex` and the `ItemCount` provided by the ItemAdapter.
However, on Android, when both a Header and a Footer are defined, the
ItemCount consider it, leading to incorrect triggering logic.
 
### Description of Change
Updated the logic to ensure that the ItemCount correctly includes both
the Header and Footer. This change ensures that the Footer becomes
visible as expected and that the SendRemainingThresholdReached command
is properly executed.

### Issues Fixed
Fixes #29588 

### Tested the behaviour in the following platforms
- [x] Android
- [x] Windows
- [x] iOS
- [x] Mac


### Output Screenshot
Before Issue Fix | After Issue Fix |
|----------|----------|
|<video width="40" height="60" alt="Before Fix"
src="https://github.com/user-attachments/assets/919c566b-c5f4-431f-9498-2b7f254e73d9">|<video
width="50" height="40" alt="After Fix"
src="https://github.com/user-attachments/assets/ad7490d5-410c-43a8-b4bd-8702a2bfc48f">|

---------

Co-authored-by: MartyIX <203266+MartyIX@users.noreply.github.com>
PureWeen added a commit that referenced this pull request Mar 11, 2026
## What's Coming

.NET MAUI inflight/candidate introduces significant improvements across
all platforms with focus on quality, performance, and developer
experience. This release includes 46 commits with various improvements,
bug fixes, and enhancements.


## Button
- [Android] Implemented material3 support for Button by @Dhivya-SF4094
in #33173
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 support for
Button](#33172)
  </details>

## CollectionView
- [Android] Fix RemainingItemsThresholdReachedCommand not firing when
CollectionView has Header and Footer both defined by @SuthiYuvaraj in
#29618
  <details>
  <summary>🔧 Fixes</summary>

- [Android : RemainingItemsThresholdReachedCommand not firing when
CollectionVew has Header and Footer both
defined](#29588)
  </details>

- [iOS/MacCatalyst] Fix CollectionView ScrollTo for horizontal layouts
by @Shalini-Ashokan in #33853
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS/MacCatalyst] CollectionView ScrollTo does not work with
horizontal Layout](#33852)
  </details>

- [iOS & Mac] Fixed IndicatorView Size doesnt update dynamically by
@SubhikshaSf4851 in #31129
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS, Catalyst] IndicatorView.IndicatorSize does not update
dynamically at runtime](#31064)
  </details>

- [Android] Fix for CollectionView Scrolled event is triggered on the
initial app load. by @BagavathiPerumal in
#33558
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] CollectionView Scrolled event is triggered on the initial
app load.](#33333)
  </details>

- [iOS, Android] Fix for CollectionView IsEnabled=false allows touch
interactions by @praveenkumarkarunanithi in
#31403
  <details>
  <summary>🔧 Fixes</summary>

- [More issues with CollectionView IsEnabled, InputTransparent, Opacity
via Styles and code behind](#19771)
  </details>

- [iOS] Fix VerticalOffset Update When Modifying
CollectionView.ItemsSource While Scrolled by @devanathan-vaithiyanathan
in #34153
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS]VerticalOffset Not Reset to Zero After Clearing ItemSource in
CollectionView](#26798)
  </details>

## DateTimePicker
- [Android] Fix DatePicker MinimumDate/MaximumDate not updating
dynamically by @HarishwaranVijayakumar in
#33687
  <details>
  <summary>🔧 Fixes</summary>

- [[regression/8.0.3] [Android] DatePicker control minimum date
issue](#19256)
- [[Android] DatePicker does not update MinimumDate / MaximumDate in the
Popup when set in the viewmodel after first
opening](#33583)
  </details>

## Drawing
- Android drawable perf by @albyrock87 in
#31567

## Editor
- [Android] Implemented material3 support for Editor by
@SyedAbdulAzeemSF4852 in #33478
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 Support for
Editor](#33476)
  </details>

## Entry
- [iOS, Mac] Fix for CursorPosition not updating when typing into Entry
control by @SyedAbdulAzeemSF4852 in
#30505
  <details>
  <summary>🔧 Fixes</summary>

- [Entry control CursorPosition does not update on TextChanged event
[iOS Maui 8.0.7] ](#20911)
- [CursorPosition not calculated correctly on behaviors events for iOS
devices](#32483)
  </details>

## Flyoutpage
- [Android, Windows] Fix for FlyoutPage toolbar button not updating on
orientation change by @praveenkumarkarunanithi in
#31962
  <details>
  <summary>🔧 Fixes</summary>

- [Flyout page in Android does not show flyout button (burger)
consistently](#24468)
  </details>

- Fix for First Item in CollectionView Overlaps in FlyoutPage.Flyout on
iOS by @praveenkumarkarunanithi in
#29265
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS] CollectionView not rendering first item correctly in
FlyoutPage.Flyout](#29170)
  </details>

## Image
- [Android] Fix excessive memory usage for stream and resource-based
image loading by @Shalini-Ashokan in
#33590
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Unexpected high Bitmap.ByteCount when loading image via
ImageSource.FromResource() or ImageSource.FromStream() in .NET
MAUI](#33239)
  </details>

- [Android] Fix for Resize method returns an image that has already been
disposed by @SyedAbdulAzeemSF4852 in
#29964
  <details>
  <summary>🔧 Fixes</summary>

- [In GraphicsView, the Resize method returns an image that has already
been disposed](#29961)
- [IIMage.Resize bugged
behaviour](#31103)
  </details>

## Label
- Fixed Label Span font property inheritance when applied via Style by
@SubhikshaSf4851 in #34110
  <details>
  <summary>🔧 Fixes</summary>

- [`Span` does not inherit text styling from `Label` if that styling is
applied using `Style` ](#21326)
  </details>

- [Android] Implemented material3 support for Label by
@SyedAbdulAzeemSF4852 in #33599
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 Support for
Label](#33598)
  </details>

## Map
- [Android] Fix Circle Stroke color is incorrectly updated as Fill
color. by @NirmalKumarYuvaraj in
#33643
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Circle Stroke color is incorrectly updated as Fill
color.](#33642)
  </details>

## Mediapicker
- [iOS] Fix: invoke MediaPicker completion handler after
DismissViewController by @yuriikyry4enko in
#34250
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS] Media Picker UIImagePickerController closing
issue](#21996)
  </details>

## Navigation
- Fix ContentPage memory leak on Android when using NavigationPage
modally (fixes #33918) by @brunck in
#34117
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Modal TabbedPage whose tabs are NavigationPage(ContentPage)
is retained after
PopModalAsync()](#33918)
  </details>

## Picker
- [Android] Implement material3 support for TimePicker by
@HarishwaranVijayakumar in #33646
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 support for
TimePicker](#33645)
  </details>

- [Android] Implemented Material3 support for Picker by
@SyedAbdulAzeemSF4852 in #33668
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 support for
Picker](#33665)
  </details>

## RadioButton
- [Android] Implemented material3 support for RadioButton by
@SyedAbdulAzeemSF4852 in #33468
  <details>
  <summary>🔧 Fixes</summary>

- [Implement Material3 Support for
RadioButton](#33467)
  </details>

## Setup
- Clarify MA003 error message by @jeremy-visionaid in
#34067
  <details>
  <summary>🔧 Fixes</summary>

- [MA003 false positive with
9.0.21](#26599)
  </details>

## Shell
- [Android] Fix TabBar FlowDirection not updating dynamically by
@SubhikshaSf4851 in #33091
  <details>
  <summary>🔧 Fixes</summary>

- [[Android, iOS] FlowDirection RTL is not updated dynamically on Shell
TabBar](#32993)
  </details>

- [Android] Fix page not disposed on Shell replace navigation by
@Vignesh-SF3580 in #33426
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] [Shell] replace navigation leaks current
page](#25134)
  </details>

- [Android] Fixed Shell flyout does not disable scrolling when
FlyoutVerticalScrollMode is set to Disabled by @NanthiniMahalingam in
#32734
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Shell.FlyoutVerticalScrollMode="Disabled" does not disable
scrolling](#32477)
  </details>

## Single Project
- Fix: Throw a clear error when an SVG lacks dimensions instead of a
NullReferenceException by @Shalini-Ashokan in
#33194
  <details>
  <summary>🔧 Fixes</summary>

- [MAUI Fails To Convert Valid SVG Files Into PNG Files (Object
reference not set to an instance of an
object)](#32460)
  </details>

## SwipeView
- [iOS] Fix SwipeView stays open on iOS after updating content by
@devanathan-vaithiyanathan in #31248
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS] - Swipeview with collectionview
issue](#19541)
  </details>

## TabbedPage
- [Windows] Fixed IsEnabled Property not works on Tabs by
@NirmalKumarYuvaraj in #26728
  <details>
  <summary>🔧 Fixes</summary>

- [ShellContent IsEnabledProperty does not
work](#5161)
- [[Windows] Shell Tab IsEnabled Not
Working](#32996)
  </details>

- [Android] Fix NavigationBar overlapping StatusBar when NavigationBar
visibility changes by @Vignesh-SF3580 in
#33359
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] NavigationBar overlaps with StatusBar when mixing
HasNavigationBar=true/false in TabbedPage on Android 15 (API
35)](#33340)
  </details>

## Templates
- Fix for unable to open task using keyboard navigation on windows
platform by @SuthiYuvaraj in #33647
  <details>
  <summary>🔧 Fixes</summary>

- [Unable to open task using keyboard: A11y_.NET maui_User can get all
the insights of
Dashboard_Keyboard](#30787)
  </details>

## TitleView
- Fix for NavigationPage.TitleView does not expand with host window in
iPadOS 26+ by @SuthiYuvaraj in #33088

## Toolbar
- [iOS] Fix toolbar items ignoring BarTextColor on iOS/MacCatalyst 26+
by @Shalini-Ashokan in #34036
  <details>
  <summary>🔧 Fixes</summary>

- [[iOS 26] ToolbarItem color with custom BarTextColor not
working](#33970)
  </details>

- [Android] Fix for ToolbarItem retaining the icon from the previous
page on Android when using NavigationPage. by @BagavathiPerumal in
#32311
  <details>
  <summary>🔧 Fixes</summary>

- [Toolbaritem keeps the icon of the previous page on Android, using
NavigationPage (not shell)](#31727)
  </details>

## WebView
- [Android] Fix WebView in a grid expands beyond it's cell by
@devanathan-vaithiyanathan in #32145
  <details>
  <summary>🔧 Fixes</summary>

- [Android - WebView in a grid expands beyond it's
cell](#32030)
  </details>

## Xaml
- ContentPresenter: Propagate binding context to children with explicit
TemplateBinding by @HarishwaranVijayakumar in
#30880
  <details>
  <summary>🔧 Fixes</summary>

- [Binding context in
ContentPresenter](#23797)
  </details>


<details>
<summary>🔧 Infrastructure (1)</summary>

- [Revert] ContentPresenter: Propagate binding context to children with
explicit TemplateBinding by @Ahamed-Ali in
#34332

</details>

<details>
<summary>🧪 Testing (6)</summary>

- [Testing] Feature Matrix UITest Cases for Shell Flyout Page by
@NafeelaNazhir in #32525
- [Testing] Feature Matrix UITest Cases for Brushes by
@LogishaSelvarajSF4525 in #31833
- [Testing] Feature Matrix UITest Cases for BindableLayout by
@LogishaSelvarajSF4525 in #33108
- [Android] Add UI tests for Material 3 CheckBox by
@HarishwaranVijayakumar in #34126
  <details>
  <summary>🔧 Fixes</summary>

- [[Android] Add UI tests for Material 3
CheckBox](#34125)
  </details>
- [Testing] Feature Matrix UITest Cases for Shell Tabbed Page by
@NafeelaNazhir in #33159
- [Testing] Fixed Test case failure in PR 34294 - [03/2/2026] Candidate
- 1 by @TamilarasanSF4853 in #34334

</details>

<details>
<summary>📦 Other (2)</summary>

- Bumps Syncfusion.Maui.Toolkit dependency to version 1.0.9 by
@PaulAndersonS in #34178
- Fix crash when closing Windows based app when using TitleBar by
@MFinkBK in #34032
  <details>
  <summary>🔧 Fixes</summary>

- [Unhandled exception "Value does not fall within the expected range"
when closing Windows app](#32194)
  </details>

</details>
**Full Changelog**:
main...inflight/candidate
@github-actions github-actions bot locked and limited conversation to collaborators Mar 26, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-controls-collectionview CollectionView, CarouselView, IndicatorView community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration s/agent-approved AI agent recommends approval - PR fix is correct and optimal s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) s/agent-suggestions-implemented Maintainer applies when PR author adopts agent's recommendation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Android : RemainingItemsThresholdReachedCommand not firing when CollectionVew has Header and Footer both defined

8 participants