Skip to content
This repository has been archived by the owner on May 1, 2024. It is now read-only.

[Android] CarouselView position resets when visibility toggled #12864

Merged
merged 9 commits into from
Jan 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>

<controls:TestContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:Xamarin.Forms.Controls"
x:Class="Xamarin.Forms.Controls.Issues.Issue12848"
Title="Issue 12848">
<StackLayout>
<Label
Padding="12"
BackgroundColor="Black"
TextColor="White"
Text="Swipe the CarouselView to select the item numbered 2. Then, tap the Hide Button to hide the Carousel and the Show Button to show the Carousel again. If the position of the Carousel is the same as before hiding, the test has passed."/>
<CarouselView
AutomationId="TestCarouselView"
x:Name="carousel"
HorizontalOptions="Center"
ItemsSource="{Binding}">
<CarouselView.ItemTemplate>
<DataTemplate>
<Label
Text="{Binding}"
FontSize="96"
HorizontalTextAlignment="Center"/>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
<Label
AutomationId="CarouselPosition"
Text="{Binding Source={x:Reference carousel}, Path=Position}"
HorizontalOptions="Center"/>
<Button
AutomationId="HideButton"
Text="Hide CarouselView"
Clicked="OnHideButtonClicked"/>
<Button
AutomationId="ShowButton"
Text="Show CarouselView"
Clicked="OnShowButtonClicked"/>
</StackLayout>
</controls:TestContentPage>
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;

#if UITEST
using Xamarin.Forms.Core.UITests;
using NUnit.Framework;
#endif

namespace Xamarin.Forms.Controls.Issues
{
[Preserve(AllMembers = true)]
[Issue(IssueTracker.Github, 12848, "[Bug] CarouselView position resets when visibility toggled",
PlatformAffected.Android)]
public partial class Issue12848 : TestContentPage
{
protected override void Init()
{
#if APP
InitializeComponent();

BindingContext = new List<int> { 1, 2, 3 };
#endif
}

#if APP
void OnShowButtonClicked(object sender, EventArgs e)
{
carousel.IsVisible = true;
}

void OnHideButtonClicked(object sender, EventArgs e)
{
carousel.IsVisible = false;
}
#endif

#if UITEST
[Test]
public void Issue12848Test()
{
RunningApp.WaitForElement("TestCarouselView");
RunningApp.SwipeRightToLeft();
Assert.AreEqual(1, int.Parse(RunningApp.Query(q => q.Marked("CarouselPosition"))[0].Text));
RunningApp.Tap("HideButton");
RunningApp.Tap("ShowButton");
Assert.AreEqual(1, int.Parse(RunningApp.Query(q => q.Marked("CarouselPosition"))[0].Text));
RunningApp.Screenshot("Test passed");
}
#endif
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1682,6 +1682,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Issue12777.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue11911.xaml.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue11691.xaml.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue12848.xaml.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue12315.xaml.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue12912.xaml.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue12910.xaml.cs" />
Expand Down Expand Up @@ -2059,6 +2060,9 @@
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue11691.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue12848.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue12315.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -334,21 +334,21 @@ void UpdateItemDecoration()

void UpdateInitialPosition()
{
int position = 0;
int itemCount = 0;
int position;

if (Carousel.CurrentItem != null)
{
var carouselEnumerator = Carousel.ItemsSource.GetEnumerator();
var items = new List<object>();

while (carouselEnumerator.MoveNext())
{
if (carouselEnumerator.Current == Carousel.CurrentItem)
position = itemCount;

items.Add(carouselEnumerator.Current);
itemCount++;
}

position = items.IndexOf(Carousel.CurrentItem);
Carousel.Position = position;
}
else
Expand Down