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

How to get data by json on xamarin android

public async override void OnActivityCreated (Bundle savedInstanceState)
  {
   base.OnActivityCreated (savedInstanceState);

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

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

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

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

  }


  public class TrackAdapter:BaseAdapter
  {
   LayoutInflater _inflater;
   List<TrackModel.Track> _tracks;

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

   public override TrackModel.Track 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.ExploreFragment, parent, false);

    var track = _tracks [position];
    var viewHolder = view.Tag as TrackViewHolder;
    if (viewHolder == null) {
     viewHolder.Title = view.FindViewById<TextView> (Resource.Id.textviewItems);
     viewHolder.SubTitle = view.FindViewById<TextView> (Resource.Id.textviewSubItem);
     viewHolder.Image = view.FindViewById<ImageView> (Resource.Id.image);
     view.Tag = viewHolder;
    }

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

    return view;
   }
  }

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

public 覆盖 TrackModel.Track this[int index]。它得到一个错误被标记为过模但没有找到合适的索引器来覆盖。

我想从 Xamarin android 上的列表视图 json 获取数据。 如果它是非通用应用程序,那么它很容易使用。

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

您需要实施自定义适配器,为每个曲目列表项加载布局。您的自定义适配器可能看起来像我在没有进一步测试的情况下凭空写出的以下示例。但是它实现了自定义适配器需要实现的必需方法。

重要的部分是 GetView 方法,returns 每次列表视图要求表示一个新项目时您的轨道布局。为了减少应用程序内存,它使用了 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 创建一个新实例,传递上下文和您希望在列表视图中显示的轨道列表。

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);
    }
}