【问题标题】:Why ListView shows Object.object instead of data?为什么 ListView 显示 Object.object 而不是数据?
【发布时间】:2016-10-08 16:45:29
【问题描述】:

我这里有一些带有灰色简短说明的代码(编码 cmets):

namespace FridgeApp
{
    [Activity( MainLauncher = true, Icon = "@drawable/icon")]
    public class MenuActivity : Activity
    {
        public string content;
        ListView productsListView;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

           SetContentView(Resource.Layout.Menu);

            //GETTING ACCES TO XML FILES
            AssetManager assets = this.Assets;

            //PLACING CONTENT OF XML FILE "products.xml" TO 'content' VARIABLE
            using (StreamReader sr = new StreamReader(Assets.Open("products.xml")))
            {
                content = sr.ReadToEnd();
            }

            List<Product> _productsList = ProductsFromXml();

            //CONVERTING FROM LIST TO AN ARRAY
            Array prdcts = _productsList.ToArray();

            Button button = FindViewById<Button>(Resource.Id.button1);

            //BY CLICKING A BUTTON APP SETS ANOTHER LAYOUT AND DISPLAYS A LIST OF PRODUCTS
            button.Click += delegate
            {
                SetContentView(Resource.Layout.ProductsList);
                productsListView = FindViewById<ListView>(Resource.Id.listView1);
                productsListView.Adapter = new ArrayAdapter (this, Android.Resource.Layout.SimpleListItemMultipleChoice, prdcts );
                productsListView.ChoiceMode = ChoiceMode.Multiple;
            };                          
        }

        //THIS MEHOD READS ACTUAL DATA FROM XML FILE "products.xml" AND PLACES IT IN  LIST 'productsList' 
        public List<Product> ProductsFromXml()
        {
            List<Product> productsList = new List<Product>();

            XmlDocument productsXml = new XmlDocument();
            productsXml.LoadXml(content);

            XmlNode root = productsXml.SelectSingleNode("CurrentProducts");
            XmlNodeList nodeList = root.SelectNodes("Product");
            foreach (XmlNode n in nodeList)
            {
                Product p = new Product();
                p.Name = n.SelectSingleNode("Name").InnerText;
                p.Quantity = n.SelectSingleNode("Quantity").InnerText;
                productsList.Add(p);
            }
            return productsList;
        }
    }
}   

对于每个产品“名称”和“数量”,都有一个创建了这些参数的类,称为“产品”。 有一个 XML 文件:

<CurrentProducts>
<Product>
    <Name>Apple</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Banana</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Bread</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Butter</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Cucumber</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Milk</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Cheese</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Smoked Sausage</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Tomato</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Egg</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Chicken</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Chocolate</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Potato</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Onion</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Lettuce</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Sour Cream</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Tomato Sauce</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Carrot</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Orange Juice</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Salmon</Name>
    <Quantity>1</Quantity>
</Product>
<Product>
    <Name>Flavour</Name>
    <Quantity>1 kg</Quantity>
</Product>
<Product>
    <Name>Salt</Name>
    <Quantity>1 kg</Quantity>
</Product>
<Product>
    <Name>Sugar</Name>
    <Quantity>1 kg</Quantity>
</Product>

下面是点击按钮并显示数组内容时的模拟器屏幕照片:

问题是,为什么它显示Products.Product而不是products.xml写的实际产品?

这是类的代码:

  public class Product
  { 

    public string Name;
    public string Quantity;
    public MeasurementType UnitMeasure;

    public Product()
    {
    }

    public Product(string _name)
    {
        this.Name = _name;
    }

【问题讨论】:

  • 是的,我已经调试过了,没有错误,一切正常。但问题是,以 xml 文件编写的产品不会出现在应用程序屏幕上(如照片所示)。将 xml 文件中的数据放入列表的方法是在 ConsoleApplication 中创建的,当列表显示在那里时,它会显示在 xml 文件中定义的产品。现在它显示“Products.Product”。这就是我要寻求帮助的事情。
  • 正如@Uno 指出的那样,ListView 不知道要为您的自定义类显示什么。默认情况下,它只会调用所有 C# 对象都支持的 ToString()。 ToString() 的默认行为是显示类的名称,但您可以通过提供自己的 ToString() 实现来覆盖此行为。
  • 所以,据我了解,我基本上只需要将公共覆盖字符串 ToS​​tring() 添加到我的 Product 类中
  • 是的,按照@Uno 的建议去做

标签: c# android xml xamarin xamarin.android


【解决方案1】:

你应该分享Product类的代码;我相信 ListView 在产品对象上调用 ToString() 并且它们只是返回类型名称,因为类型不知道更好。

尝试添加:

class Product
{
    public override string ToString()
    {
        // Format your product name here as you want it to be displayed.
        return $"{Name} - {Quantity}";
    }
}

【讨论】:

  • 上述类的代码
  • @Zilvinas 那么我认为这是问题所在,您应该添加 ToString 覆盖。
  • 我应该将它添加到Products 类吗?我应该在何时何地使用它? :)
  • 它被 ListView 内部隐式使用。您需要在此处添加它,因为 ListView 只有产品对象作为名称提供者。如果您想要更好的设计,您可以在 Product 对象周围创建一个包装器,以分离显示逻辑。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2014-12-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多