我无法在xamarin上将数据从json加载到tableview

时间:2015-07-24 01:56:56

标签: json uitableview xamarin

我需要你的帮助。

... UIViewControl

    var data= await track.QueryCategory(link);
if(data!=null)
{
var get_data=JsonConvert.DeserializeObject<Categorycs.RootObject>(data);
_table = new UITableView {
Frame = new CoreGraphics.CGRect (0, 0, View.Bounds.Width, View.Bounds.Height),
Source= new TableSoundCloudSource(get_data.tracks)

                        };
                        View.AddSubview (_table);
                    }

TableSource.cs

public class TableSource: UITableViewSource

{
    List<string> tableItems;
    string cellIdentifier="TableCell";

    public TableSource (List<string> items)
    {
        tableItems = items;
    }

    public override nint RowsInSection(UITableView tableview, nint section)
    {
        return tableItems;
    }

    public override UITableViewCell GetCell (UITableView tableView, Foundation.NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell (cellIdentifier);
        if (cell == null) {
            cell = new UITableViewCell (UITableViewCellStyle.Default, cellIdentifier);
        } else
            cell.TextLabel.Text = tableItems [indexPath.Row];
        return cell;
    }
}

}

Public class Categorycs
    {
    public class RootObject
                {
                    public List<Track> tracks { get; set; }
                    public string tag { get; set; }
                    public string next_href { get; set; }
                }
    }
public class Track
        {
            public string urn { get; set; }
            public string uri { get; set; }
            public string permalink { get; set; }
            public string permalink_url { get; set; }
            public string title { get; set; }
            public string description { get; set; }
            public string track_type { get; set; }
            public string genre { get; set; }
            public string tag_list { get; set; }
            public int duration { get; set; }
            public bool? downloadable { get; set; }
            public string download_url { get; set; }
            public int original_content_size { get; set; }
            public bool streamable { get; set; }
            public bool commentable { get; set; }
            public string sharing { get; set; }
            public string created_at { get; set; }
            public string updated_at { get; set; }
            public string isrc { get; set; }
            public string state { get; set; }
            public int? likes_count { get; set; }
            public int? playback_count { get; set; }
            public int? reposts_count { get; set; }
            public int? download_count { get; set; }
            public int? comment_count { get; set; }
            public string embeddable_by { get; set; }
            public string license { get; set; }
            public string artwork_url { get; set; }
            public string stream_url { get; set; }
            public string waveform_url { get; set; }
            public string purchase_url { get; set; }
            public string purchase_title { get; set; }
            public bool reveal_comments { get; set; }
            public bool reveal_stats { get; set; }
            public bool feedable { get; set; }
            public bool geo_blocking { get; set; }
            public object geo_blockings { get; set; }
            public bool embeddable { get; set; }
            public string label_name { get; set; }
            public string release_date { get; set; }
            public object schedule { get; set; }
            public Visuals visuals { get; set; }
            public object publisher_metadata { get; set; }
            public object monetization { get; set; }
            public int user_id { get; set; }
            public User user { get; set; }
            public string policy { get; set; }
            public string monetization_model { get; set; }
            public object secret_token { get; set; }
            public object secret_uri { get; set; }
            public object publisher_state { get; set; }
            public string last_modified { get; set; }
            public object disabled_at { get; set; }
            public object disabled_reason { get; set; }
            public bool has_downloads_left { get; set; }
            public string kind { get; set; }
            public int id { get; set; }
        }
  

错误:错误CS1503:参数#1'不能   convertSystem.Collections.Generic.List&LT; 'Categorycs.Track' &GT;”表达   输入`string []'。

  • 我尝试将'List&lt;'string'&gt;'替换为List&lt;'Categorycs.Track'&gt;但app不会运行。

1 个答案:

答案 0 :(得分:0)

在这里,您传递的是TableSource get_data.tracks,这是一个List<Track>

Source= new TableSoundCloudSource(get_data.tracks)

但是在这里,您告诉TableSource接受List<string>

public TableSource (List<string> items)

这是&#34;类型不匹配&#34; - 期望A类型的对象,但是你传递的是B类对象。在某些情况下,它可以自动将A转换为B,但在这种情况下不会。

(我假设它被命名为&#34; TableSoundCloudSource&#34;在一个地方和&#34; TableSource&#34;在另一个地方的事实是剪切和粘贴错误。如果不是,那是你的代码的另一个问题。)

您需要修改您的TableSource以接受List<Track>(这将需要多次更改),或者您需要将List<string>传递给它,这是它目前所期望的。

您报告的第二个错误是因为:

public override nint RowsInSection(UITableView tableview, nint section)
    {
        return tableItems;
    }

该函数应该返回一个nint,但是你要返回tableItems,这是一个List(它对于什么样的列表并不重要)。您真正想要返回的是tableItems.Count,这是列表中元素的数量。

这段代码总是错误的,但由于早期的问题,编译器可能永远都不会告诉你这很糟糕。调试是这样的 - 修复一个bug可以发现(或创建)更多。你只需要偷偷摸摸它们直到它起作用。

最后,

cell.TextLabel.Text = tableItems [indexPath.Row];

Text是一个字符串,tableItems [indexPath.Row]是一个Track。您无法将音轨分配给字符串 - 这是另一种类型不匹配。相反,这样做

cell.TextLabel.Text = tableItems [indexPath.Row].title;

由于Track的标题属性为string,因此可以使用(我假设您要使用标题 - 您可以使用任何字符串属性,也可以自动使用转换为字符串)

请注意,这与Xamarin无关 - 它是基本的C#,也是概念上基本的编程。