【问题标题】:Xamarin Forms listview items improperly displayedXamarin Forms listview 项目显示不正确
【发布时间】:2019-06-05 23:42:30
【问题描述】:

我有一个由新闻对象列表填充的 ListView,这些对象是从从网站下载 rss 提要并将数据转换为新闻对象的服务中检索的。每个新闻对象都包含一个发布日期、标题、链接和描述。我的自定义视图单元只是在左侧的框中显示日期,然后在右侧剩余空间中显示标题,每个项目之间有空格。问题是列表视图仅显示 70 多个项目中的前 17 个,在第 17 号之后,其余的视图单元都在那里,但它们是空的,没有文本或日期框。我还启用了拉动刷新,它只是再次调用服务来重新填充列表(我知道效率低下,但也在努力只用新添加的新闻项更新列表),当我拉动刷新时,整个列表视图变成空白视单元。

到目前为止,我已经尝试了一些没有找到解决方案的方法,它们只会让我更加困惑。我试图通过在列表上执行 Take(20) 来限制添加的项目数量,该列表显示前 16 个项目,然后是 2 个空白项目,然后是 1 个正确显示的项目,然后是更多空白。当这个较短的列表被刷新并再次调用时,除了第 14 个单元格之外的所有单元格都是空白的。如果有的话,刷新后会留在那里,看起来是随机的。

不过,为了确认某些内容,这些项目仍然是可点击的。我仍然可以点击任何项目,即使是空白的,它也会将浏览器打开到正确的文章。

<ListView
            x:Name="newsList"
            Margin="0"
            BackgroundColor="Transparent"
            HasUnevenRows="True"
            HorizontalOptions="CenterAndExpand"
            IsPullToRefreshEnabled="True"
            ItemSelected="NewsList_ItemSelected"
            Refreshing="NewsList_Refreshing"
            SeparatorVisibility="None"
            VerticalOptions="CenterAndExpand">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Frame
                            Margin="0,5,0,5"
                            Padding="2"
                            BorderColor="Gray"
                            HeightRequest="60">
                            <AbsoluteLayout Padding="0">
                                <StackLayout
                                    AbsoluteLayout.LayoutBounds="0, 0, 60, 60"
                                    AbsoluteLayout.LayoutFlags="None"
                                    BackgroundColor="Gray">
                                    <Label
                                        HorizontalOptions="CenterAndExpand"
                                        HorizontalTextAlignment="Center"
                                        Text="{Binding Date, StringFormat='{0:MMM d}'}"
                                        TextColor="White"
                                        VerticalOptions="CenterAndExpand" />
                                    <Label
                                        HorizontalOptions="CenterAndExpand"
                                        HorizontalTextAlignment="Center"
                                        Text="{Binding Date, StringFormat='{0:yyyy}'}"
                                        TextColor="White"
                                        VerticalOptions="CenterAndExpand" />
                                </StackLayout>
                                <Label
                                    Margin="5"
                                    AbsoluteLayout.LayoutBounds="60, 0, .85, 1"
                                    AbsoluteLayout.LayoutFlags="SizeProportional"
                                    BackgroundColor="White"
                                    FontSize="16"
                                    Label.MaxLines="2"
                                    LineBreakMode="WordWrap"
                                    Text="{Binding Title}" />
                            </AbsoluteLayout>
                        </Frame>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

以及背后的代码

private NewsService newsService = new NewsService();

        public NewsPage()
        {
            InitializeComponent();

            newsList.ItemsSource = newsService.ParseRssFile().Take(20);
            Application.Current.Properties["newsUpdated"] = DateTime.Today;
        }

        private void NewsList_Refreshing(object sender, System.EventArgs e)
        {
            newsList.ItemsSource = newsService.ParseRssFile();
            newsList.EndRefresh();
        }

        private void NewsList_ItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            var News = e.SelectedItem as News;

            //do something...
            var uri = new Uri(News.Link);
            Device.OpenUri(uri);
        }

新闻服务只返回一个新闻对象列表,每个对象都包含一个标题、链接、描述字符串和一个日期时间。

预期结果是正确显示新闻日期+标题,我假设大约 70 个项目应该不难显示。

编辑:尝试在调试中打印每个新闻项目的标题和发布日期,以确认它们实际上并非都是空白的,它们不是空白的。

【问题讨论】:

    标签: c# xamarin.forms


    【解决方案1】:

    我想我已经找到了解决这个问题的方法,我启用了一个 listview 标签:

                CachingStrategy="RecycleElementAndDataTemplate"
    

    现在所有视单元都已正确填充。我不知道 为什么 它有效,但它确实有效。如果有人能提供见解,将不胜感激!

    【讨论】:

    • 自 4.0 版以来,Xamarin 开发人员将问题作为一个错误解决,我不会发疯的。此外,RecycleElement 标签会导致标签在失去其文本对齐方式时出现更多问题,例如,我将它们设置为中心,而它们是开始或结束,随机出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2018-03-16
    • 2019-12-29
    • 2019-10-25
    • 2021-12-08
    • 1970-01-01
    • 2017-12-25
    相关资源
    最近更新 更多