C# Xamarin.Forms CollectionView查看回收问题
因此,我使用CollectionView来显示一个实体列表,当按下该列表时,可以在打开和关闭状态之间切换。为此,我设置了被按下视图的父容器的HeightRequest参数的动画,然后添加我想要在视图的展开状态中显示的任何视图。以下是用于此目的的代码片段:C# Xamarin.Forms CollectionView查看回收问题,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,因此,我使用CollectionView来显示一个实体列表,当按下该列表时,可以在打开和关闭状态之间切换。为此,我设置了被按下视图的父容器的HeightRequest参数的动画,然后添加我想要在视图的展开状态中显示的任何视图。以下是用于此目的的代码片段: var animate = new Animation(d => this.HeightRequest = d, this.Bounds.Height, this.Bounds.Height + 300, Easing.Cubic
var animate = new Animation(d => this.HeightRequest = d,
this.Bounds.Height, this.Bounds.Height + 300, Easing.CubicOut);
animate.Commit(this, "a", length: 500);
this.layout.Children.Add(this.candidateList);
this.layout.Children.Add(this.openButton);
这很好,但是,如果我向下滚动列表,我会看到一些视图也会被扩展,即使我以前没有触摸它们,更重要的是,以后滚动的每一整页。有些甚至包括我添加到扩展状态的视图,显示不正确的数据。我假设这是由于CollectionView工作的回收机制,以节省渲染成本,但必须有某种方法来解决这一问题。以下是相关视图的代码:
var officesList = new CollectionView
{
ItemTemplate = new DataTemplate(typeof(OfficeListView)),
HorizontalOptions = LayoutOptions.FillAndExpand,
ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
{
SnapPointsType = SnapPointsType.None,
ItemSpacing = 10,
},
Margin = new Thickness(20, 5),
ItemSizingStrategy = ItemSizingStrategy.MeasureAllItems,
Footer = " ",
FooterTemplate = new DataTemplate(() =>
{
return new StackLayout
{
Margin = new Thickness(20, 10),
Children = {
new LocorumLabels.MediumLabel
{
Text = "x Results | No filters applied" //TODO: Bind these to footer
}
}
};
})
};
下一个片段是展开的“Office”中的CollectionView:
下面是一段视频,展示了正在发生的事情:
希望有人能让我知道一个解决方案。非常感谢。你说得对 由于
CollectionView
使用DataTemplate
,因此您需要设置视图和数据,以便在回收视图时,视图能够正常显示
保持动画工作的不明显的部分是从现在起调用动画,但在动画完成时在数据中设置值,该值会将视图从动画之前的状态更改为动画之后的状态。谢谢您的回答。我的DataTemplate对象中确实有一个状态字段,但我只使用它来跟踪视图是打开还是关闭。两个问题:当我向下滚动列表时,滚动到的视图是否被创建为新对象(而我滚动的视图是垃圾收集的)?这是否意味着我的构造函数中需要这样的代码:“嘿,你的状态是扩展的,所以你需要这个大小”还是我把它放在其他地方?@MarcusOrciuch简单地说,你需要先让它在没有动画的情况下工作,然后在需要的地方添加动画并推迟数据设置,直到动画完成。因此我发现每次在我的CollectionView中显示新视图时,都会调用构造函数,因此,我创建了一个方法,该方法将根据绑定上下文对象的状态尝试调整视图的大小。此方法在构造函数和TapSignature回调结束时调用。我将一个bool作为参数传递,以设置状态更改的动画,就像点击它一样。然而,它似乎仍然不起作用。它的行为仍然像原始视频一样,并且(使用断点)在我以随机间隔滚动时,构造函数似乎被调用。也很抱歉响应太晚。另外,我在创建内部CollectionsView的行上放置了一个断点,当我点击第一个控件时,它会中断。从理论上讲,如果我向下滚动到模拟原始视图的随机视图(因为正在创建此视图,并且正在调用我的布局方法),它也应该会中断。但是,发生这种情况时,它不会中断。请确保您在UI线程中调用了动画。@LucasZhang MSFT似乎不起作用。我将改变我对这个问题的看法,因为事实证明这是一个艰巨的挑战。我将使用Rg.pouppage来显示与CollectionView分开的扩展视图,而不是更改CollectionView中的布局。
this.candidateList = new CollectionView
{
ItemTemplate = new DataTemplate(typeof(CandidateDetailView)),
HorizontalOptions = LayoutOptions.FillAndExpand,
ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
{
SnapPointsType = SnapPointsType.None,
//ItemSpacing = 10,
},
Margin = new Thickness(10, 5),
ItemSizingStrategy = ItemSizingStrategy.MeasureAllItems,
Footer = " ",
HeightRequest = 300
};