单元格重用问题与列表视图和具有自定义渲染器的单元格

时间:2015-03-12 13:52:54

标签: c# ios xamarin xamarin.forms renderer

我正在尝试显示包含使用自定义iOS渲染器渲染的单元格的列表视图。滚动列表时,会出现令人讨厌的叠加层(如下所示)。我把它归结为以下几行代码。

App包含ListView,其ItemsSource设置为从A到Z的所有字符的虚拟列表。ItemTemplate是使用自定义{{1}创建的下面定义。

ItemCell

public class App : Application { public App() { MainPage = new ContentPage { Content = new ListView { ItemsSource = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(), ItemTemplate = new DataTemplate(typeof(ItemCell)), }, }; } } 包含绑定到列表项的ItemCell

Label

在iOS上,使用以下public class ItemCell: ViewCell { public ItemCell() { View = new Label(); View.SetBinding(Label.TextProperty, "."); } } 呈现Label。它设置了一个由FixedLabelRenderer表示的包含UILabel的{​​{1}}的本机控件。

Element

现在的问题是,显然,当重用单元格时,控件不会被删除,而只会创建一个新控件。所以我得到了下面屏幕截图中显示的叠加层。

(左:滚动前,右:滚动后)

有趣的是,这个问题不会发生在Xamarin.Forms 1.2.3或1.3.1中,而是1.3.5和1.4.0。

1 个答案:

答案 0 :(得分:-1)

哦,我找到了解决方案on the Xamarin Forum

protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
    base.OnElementChanged(e);

    if (Control == null)
        SetNativeControl(new UILabel());

    if (e.NewElement != null)
        Control.Text = e.NewElement.Text;
}

所以基本上你需要确保只创建一个 UILabel并在之后重复使用它。