图像未显示在列表视图中

时间:2017-06-19 15:10:44

标签: listview xamarin xamarin.forms visual-studio-2017

我是Android的新手,在找到他们在我引用的书中做的事情时遇到了问题。

问题的主要要点是我正在构建一个应用程序,它应该在ListView中显示图像和一些文本。文本显示但不显示图像。我最初只是将文件名放在ListItem类Source属性的引号中。

我正在尝试引用Resources的drawable目录,但是没有成功访问它。

这是代码

    using System;
    using System.Collections.Generic;
    using System.Text;

    using Android.App;
    using Android.Content.PM;
    using Android.OS;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;

    using Xamarin.Forms;

    namespace ListViewExample
    {
         public class ListItem
        {
            public string Source { get; set; }
            public string Title { get; set; }
            public string Description { get; set; }
            public string Price { get; set; }
        }

        public class ListViewCustom : ContentPage
        {
            public ListViewCustom()
            {
                ListView listView = new ListView();
                listView.ItemsSource = new ListItem[]
                {new ListItem{Source=Resource.first.png,Title="First",Description="1st item", Price="$100.00" },
                 new ListItem{Source=Resource.second.png,Title="Second",Description="2nd item", Price="$200.00" },
                new ListItem{Source=Resource.third.png,Title="Third",Description="3rd item", Price="$300.00" }
               };

                listView.ItemTemplate = new DataTemplate(typeof(ImageCell));
                listView.ItemTemplate.SetBinding        (ImageCell.ImageSourceProperty, "Source");
                listView.ItemTemplate.SetBinding(ImageCell.TextProperty, "Title");
                listView.ItemTemplate.SetBinding(ImageCell.DetailProperty, "Description");
                listView.RowHeight = 80;
                listView.BackgroundColor = Color.Black;
                listView.ItemTemplate = new DataTemplate(typeof(ListItemCell));
                Content = listView;

                listView.ItemTapped += async (sender, e) =>
                {
                    ListItem item = (ListItem)e.Item;
                    await DisplayAlert("Tapped", item.Title.ToString(), " was selected.", "OK");
                    ((ListView)sender).SelectedItem = null;
                };
            }
        }

        public class ListItemCell : ViewCell
        {
            public ListItemCell()
            {
                Image image = new Image()
                {
                    HorizontalOptions = LayoutOptions.FillAndExpand
                };

                StackLayout imageLayout = new StackLayout()
                {
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    Children =
                    {image}
                };

                Label titleLabel = new Label()
                {
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    FontSize = 25,
                    WidthRequest = 100,
                    FontAttributes = Xamarin.Forms.FontAttributes.Bold,
                    TextColor = Color.White
                };
                titleLabel.SetBinding(Label.TextProperty, "Title");

                Label descLabel = new Label()
                {
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    FontSize = 12,
                    WidthRequest = 100,
                    TextColor = Color.White
                };
                descLabel.SetBinding(Label.TextProperty, "Description");

                StackLayout viewLayoutItem = new StackLayout()
                {
                    HorizontalOptions = LayoutOptions.StartAndExpand,
                    Orientation = StackOrientation.Vertical,
                    Padding = new Thickness(10, 0, 50, 10),
                    Children =
                    {
                        imageLayout,
                        titleLabel,
                        descLabel
                    }
                };

                Label priceLabel = new Label()
                {
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    FontSize = 25,
                    FontAttributes = Xamarin.Forms.FontAttributes.Bold,
                    TextColor = Color.Aqua
                };
                priceLabel.SetBinding(Label.TextProperty, "Price");

                StackLayout viewLayout = new StackLayout()
                {
                    HorizontalOptions = LayoutOptions.StartAndExpand,
                    Orientation = StackOrientation.Horizontal,
                    Padding = new Thickness(25, 10, 55, 15),
                    Children =
                    {
                        viewLayoutItem,
                        priceLabel
                    }
                };

                View = viewLayout;
            }
        }
    }

非常感谢任何帮助。这可能是愚蠢的,但就像我说我是Android的新手

*编辑(在hvaughan3回答的评论之后,将其添加为OP作为答案发布的编辑):

好吧,我不能在这里显示代码,因为评论太长了。基本上,错误是MainActivity.cs中的这些语句中的任何一个

global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (newListViewExample.App ())

我没有对文件做任何事情,所以我有点困惑,为什么我收到错误。我甚至试过重新创建项目。相同的结果。

PS:在回答hvaughan3时,图像位于Resources \ drawable目录中。是的,我确实将listview.itemssource语句更改为只有双引号。

2 个答案:

答案 0 :(得分:0)

您是否尝试过添加源绑定?

Image image = new Image()
{
  HorizontalOptions = LayoutOptions.FillAndExpand
};
//add this missing binding
image.SetBinding(Image.SourceProperty,"Source");

答案 1 :(得分:0)

我在这里可以看到很多问题。根据您遇到的问题,我首先强烈建议您完成Xamarin Form's Binding Docs的工作(而不仅仅是阅读)。

在您发布的代码中,您将ListView.ItemTemplate设置为5次,该属性只能设置或绑定一次。你给它分配了两次(listView.ItemTemplate = ...),你尝试将它绑定到它3次(listView.SetBinding())。每次都覆盖前一个。

所以我的第一个建议就是坚持最后的任务:

listView.ItemTemplate = new DataTemplate(typeof(ListItemCell));

下一个问题是,您未对ListItemCell Image绑定任何内容。您可能希望执行以下操作:

image.SetBinding(Image.SourceProperty, "Source");

最后,当您声明ListView.ItemSource时,您正在设置每个ListItem.Source,但您并未将Resource.first.png括在双引号中。此外,这些图像是Resource.first.png还是名为first.png?如果它们实际上被命名为first.png,那么您应该将ListItem.Source设置为first.png