如何在xamarin android上通过json获取数据

如何在xamarin android上通过json获取数据,json,xamarin,xamarin.android,Json,Xamarin,Xamarin.android,public async override void OnActivityCreated(Bundle savedInstanceState) { base.OnActivityCreated(savedInstanceState); lst=View.findviewbyd(Resource.Id.lstHome); var result=await json.GetStringbyJson(“https://api-v2.soundcloud.com/explore/Popular+音乐?标

public async override void OnActivityCreated(Bundle savedInstanceState)
{
base.OnActivityCreated(savedInstanceState);
lst=View.findviewbyd(Resource.Id.lstHome);
var result=await json.GetStringbyJson(“https://api-v2.soundcloud.com/explore/Popular+音乐?标签=实验外和限制=20和链接分区=1“;
如果(结果!=null)
{
var items=Newtonsoft.Json.JsonConvert.DeserializeObject(结果);
lst.Adapter=新的TrackAdapter(活动、项、轨迹);
}
}
公共类TrackAdapter:BaseAdapter
{
充气机;
列出![2]轨;;
公共轨迹适配器(上下文、列表轨迹)
{
_充气机=LayoutFlater.FromContext(上下文);
_轨道=轨道;
}
公共覆盖TrackModel。跟踪此[int索引]
{
获取{return _tracks[index];}
}
公共覆盖整数计数{
获取{return\u tracks.Count;}
}
公共覆盖长GetItemId(int位置)
{
返回位置;
}
公共覆盖视图GetView(int位置、视图转换视图、视图组父视图)
{
视图=convertView???\u充气机.充气(Resource.Layout.exploreefragment,父项,false);
变量轨迹=_轨迹[位置];
var viewHolder=view.Tag作为TrackViewHolder;
if(viewHolder==null){
viewHolder.Title=view.findviewbyd(Resource.Id.textviewItems);
viewHolder.SubTitle=view.findviewbyd(Resource.Id.textviewSubItem);
viewHolder.Image=view.findviewbyd(Resource.Id.Image);
view.Tag=viewHolder;
}
viewHolder.Title.Text=track.Title;
viewHolder.SubTitle.Text=track.track\u类型;
Android.Net.Uri=Android.Net.Uri.Parse(track.artwork\u url);
viewHolder.Image.SetImageURI(uri);
返回视图;
}
}
公共类TrackViewHolder:Java.Lang.Object
{
公共文本视图标题{get;set;}
公共文本视图字幕{get;set;}
公共图像视图图像{get;set;}

}
您希望为listview设置适配器的方式将无法以这种方式工作。 在foreach循环中设置listview的适配器属性是完全错误的。这同样适用于您的文本视图

您需要实现一个自定义适配器,为每个曲目列表项加载布局。您的自定义适配器可能看起来像下面的例子,我已经写了我的脑海中没有进一步的测试。但它实现了自定义适配器需要实现的方法

重要的部分是GetView方法,它在每次listview请求表示新项时返回轨迹布局。为了降低应用程序内存,它使用ViewHolder模式,如果您想使用RecycleView,则不需要该模式

public class TrackAdapter : BaseAdapter<Tracks>
{
    LayoutInflater _inflater;
    List<Tracks> _tracks;

    public TrackAdapter(Context context, List<Tracks) tracks)
    {
        _inflater = LayoutInflater.FromContext(context);
        _tracks = tracks;
    }

    public override Tracks this [int index]
    {
        get { return _tracks[index]; }
    }

    public override int Count
    {
        get { return _tracks.Count; }
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView ?? _inflater.Inflate(Resource.Layout.TrackListItem, parent, false);

        var track = _tracks[position];
        var viewHolder = view.Tag as TrackViewHolder;

        if (viewHolder == null)
        {
            viewHolder = new TrackViewHolder();

            viewHolder.Title = view.FindViewById<TextView>(Resource.Id.textviewItems);
            viewHolder.Subtitle = view.FindViewById<TextView>(Resource.Id.textviewSubItems);
            viewHolder.Image = view.FindViewById<ImageView>(Resource.Id.image);

            view.Tag = viewHolder;
        }

        viewHolder.Title.Text = track.title;
        viewHolder.SubTitle.Text = track.track_type;
        viewHolder.Image.SetImageURI(Uri(track.artwork_url));

        return view;
    }


    class TrackViewHolder : Java.Lang.Object
    {
        public TextView Title { get; set; }

        public TextView SubTitle { get; set; }

        public ImageView Image { get; set; }
    }
}
公共类TrackAdapter:BaseAdapter
{
充气机;
列出![2]轨;;

公共轨道适配器(上下文上下文,列表问题是什么?您实现了适配器类吗?将适配器发布到此处我不向listview添加项您的问题不清楚。您应该指定确切的问题。您似乎想要“listview”中的数据BaseAdapter中的轨迹。您是否缺少程序集引用I尽管作为公共claas TrackAdapter:BaseAdapterList_tracks;我在跟踪codepublic override TrackModel时出错。跟踪此[int index]{get{return{return_tracks[index];}}抱歉,这是一个输入错误,应该是类。我在回答中修复了它。错误可能是由于对象类型不匹配。我假设Track是一个类,它描述了带有标题、副标题等内容的曲目。我还假设items.tracks是一个曲目列表。也许你可以用TrackModel.Track替换Track来修复它
public override void OnActivityCreated (Bundle savedInstanceState)
{
    base.OnActivityCreated (savedInstanceState);

    lst = View.FindViewById<ListView> (Resource.Id.lstHome);

    var result = json.GetStringbyJson ("https://api-v2.soundcloud.com/explore/Popular+Music?tag=out-of-experiment&limit=20&linked_partitioning=1");

    if (result != null)
    {
        var items = JsonConvert.DeserializeObject<TrackModel.RootObject> (result);

        lst.Adapter = new TrackAdapter(Activity, items.tracks);
    }
}