回收站视图 (Xamarin Android )

Posted

技术标签:

【中文标题】回收站视图 (Xamarin Android )【英文标题】:Recycler View (Xamarin Android ) 【发布时间】:2017-03-19 04:19:22 【问题描述】:

我使用 Xamarin 为 android 编写应用程序。

我尝试制作回收站视图。

这是我的 json:http://pastebin.com/rL214a2T

我有这样的课程:

 public class Billing

    public string first_name  get; set; 
    public string last_name  get; set; 
    public string company  get; set; 
    public string address_1  get; set; 
    public string address_2  get; set; 
    public string city  get; set; 
    public string state  get; set; 
    public string postcode  get; set; 
    public string country  get; set; 
    public string email  get; set; 
    public string phone  get; set; 


public class Shipping

    public string first_name  get; set; 
    public string last_name  get; set; 
    public string company  get; set; 
    public string address_1  get; set; 
    public string address_2  get; set; 
    public string city  get; set; 
    public string state  get; set; 
    public string postcode  get; set; 
    public string country  get; set; 


public class Result

    public int id  get; set; 
    public int parent_id  get; set; 
    public string status  get; set; 
    public string order_key  get; set; 
    public int number  get; set; 
    public string currency  get; set; 
    public string version  get; set; 
    public bool prices_include_tax  get; set; 
    public string date_created  get; set; 
    public string date_modified  get; set; 
    public int customer_id  get; set; 
    public string discount_total  get; set; 
    public string discount_tax  get; set; 
    public string shipping_total  get; set; 
    public string shipping_tax  get; set; 
    public string cart_tax  get; set; 
    public string total  get; set; 
    public string total_tax  get; set; 
    //public List<Billing> billing  get; set; 
    public Billing billing  get; set; 
    public Shipping shipping  get; set; 
    public string payment_method  get; set; 
    public string payment_method_title  get; set; 
    public string transaction_id  get; set; 
    public string customer_ip_address  get; set; 
    public string customer_user_agent  get; set; 
    public string created_via  get; set; 
    public string customer_note  get; set; 
    public string date_completed  get; set; 
    public string date_paid  get; set; 
    public string cart_hash  get; set; 
    public List<object> line_items  get; set; 
    public List<object> tax_lines  get; set; 
    public List<object> shipping_lines  get; set; 
    public List<object> fee_lines  get; set; 
    public List<object> coupon_lines  get; set; 
    public List<object> refunds  get; set; 


public class RootObject

    public List<Result> results  get; set; 

我这样写课:

 using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using ModernHttpClient;
using Newtonsoft.Json;

namespace StarWars.Api.Repository

    public class MoviesRepository
    
        public async Task<RootObject> GetAllFilms()
        
            var httpClient = GetHttpClient();

            var response = await httpClient.GetAsync(ServiceEndPoints.StartWarsApiBaseUri).ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            
                var content = response.Content;

                string jsonString = await content.ReadAsStringAsync().ConfigureAwait(false);


                return JsonConvert.DeserializeObject<RootObject>(jsonString);
            
            return new RootObject();
        

        private HttpClient GetHttpClient()
        
            var httpClient = new HttpClient(new NativeMessageHandler())
            
                BaseAddress = new Uri(ServiceEndPoints.StartWarsApiBaseUri)
            ;


            httpClient.DefaultRequestHeaders.Accept.Clear();

            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            return httpClient;
        
    

    public class ServiceEndPoints
    
        public static readonly string StartWarsApiBaseUri = "http://api.simplegames.com.ua/index.php/?wc_orders=processing_orders";
       // public static readonly string GetFilmsUri = "films";
    

但是当我尝试启动应用程序时出现此错误

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'StarWars.Api.Repository.RootObject' because the type requires a JSON object (e.g. "name":"value") to deserialize correctly.

To fix this error either change the JSON to a JSON object (e.g. "name":"value") or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.

据我所知,我需要设置

我该如何解决?

更新

使用 Resharper 我重新制作这样的代码

 public async Task<List<RootObject>> GetAllFilms()
    
        var httpClient = GetHttpClient();

        var response = await httpClient.GetAsync(ServiceEndPoints.StartWarsApiBaseUri).ConfigureAwait(false);

        if (response.IsSuccessStatusCode)
        
            var content = response.Content;

            string jsonString = await content.ReadAsStringAsync().ConfigureAwait(false);


            return JsonConvert.DeserializeObject<List<RootObject>>(jsonString);
        
        return new List<RootObject>();
    

    private HttpClient GetHttpClient()
    
        var httpClient = new HttpClient(new NativeMessageHandler())
        
            BaseAddress = new Uri(ServiceEndPoints.StartWarsApiBaseUri)
        ;


        httpClient.DefaultRequestHeaders.Accept.Clear();

        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        return httpClient;
    


public class ServiceEndPoints

    public static readonly string StartWarsApiBaseUri = "http://api.simplegames.com.ua/index.php/?wc_orders=processing_orders";
   // public static readonly string GetFilmsUri = "films";

但我在这一行的 MainActivity 中有错误 var moviesAdapter = new MovieAdapter(films.results)

这里是错误

错误 CS1061“列表”不包含“结果”的定义,并且找不到接受“列表”类型的第一个参数的扩展方法“结果”(您是否缺少 using 指令或程序集引用?)

【问题讨论】:

你能分享你的json吗? pastebin.com/rL214a2T@mww 【参考方案1】:

您需要更改模型类,如果您不知道应该如何查看模型类,您可以使用json2sharp 之类的工具。你不能使用你的类反序列化JSON。使用此类代替您的。

public class Billing

    public string first_name  get; set; 
    public string last_name  get; set; 
    public string company  get; set; 
    public string address_1  get; set; 
    public string address_2  get; set; 
    public string city  get; set; 
    public string state  get; set; 
    public string postcode  get; set; 
    public string country  get; set; 
    public string email  get; set; 
    public string phone  get; set; 


public class Shipping

    public string first_name  get; set; 
    public string last_name  get; set; 
    public string company  get; set; 
    public string address_1  get; set; 
    public string address_2  get; set; 
    public string city  get; set; 
    public string state  get; set; 
    public string postcode  get; set; 
    public string country  get; set; 


public class LineItem

    public int id  get; set; 
    public string name  get; set; 
    public string sku  get; set; 
    public int product_id  get; set; 
    public int variation_id  get; set; 
    public int quantity  get; set; 
    public string tax_class  get; set; 
    public string price  get; set; 
    public string subtotal  get; set; 
    public string subtotal_tax  get; set; 
    public string total  get; set; 
    public string total_tax  get; set; 
    public List<object> taxes  get; set; 
    public List<object> meta  get; set; 


public class ShippingLine

    public int id  get; set; 
    public string method_title  get; set; 
    public string method_id  get; set; 
    public string total  get; set; 
    public string total_tax  get; set; 
    public List<object> taxes  get; set; 


public class RootObject

    public int id  get; set; 
    public int parent_id  get; set; 
    public string status  get; set; 
    public string order_key  get; set; 
    public int number  get; set; 
    public string currency  get; set; 
    public string version  get; set; 
    public bool prices_include_tax  get; set; 
    public string date_created  get; set; 
    public string date_modified  get; set; 
    public int customer_id  get; set; 
    public string discount_total  get; set; 
    public string discount_tax  get; set; 
    public string shipping_total  get; set; 
    public string shipping_tax  get; set; 
    public string cart_tax  get; set; 
    public string total  get; set; 
    public string total_tax  get; set; 
    public Billing billing  get; set; 
    public Shipping shipping  get; set; 
    public string payment_method  get; set; 
    public string payment_method_title  get; set; 
    public string transaction_id  get; set; 
    public string customer_ip_address  get; set; 
    public string customer_user_agent  get; set; 
    public string created_via  get; set; 
    public string customer_note  get; set; 
    public string date_completed  get; set; 
    public string date_paid  get; set; 
    public string cart_hash  get; set; 
    public List<LineItem> line_items  get; set; 
    public List<object> tax_lines  get; set; 
    public List<ShippingLine> shipping_lines  get; set; 
    public List<object> fee_lines  get; set; 
    public List<object> coupon_lines  get; set; 
    public List<object> refunds  get; set; 

【讨论】:

对于当前响应,没有 tax_lines 、 fee_lines 、 coupon_lines 、refunds 的数据,但最好创建一个包含所有可能数据的 json 并使用 json2csharp.com 谢谢老兄。它有帮助

以上是关于回收站视图 (Xamarin Android )的主要内容,如果未能解决你的问题,请参考以下文章

与使用 xamarin 的设计器屏幕相比,Android 设备上的视图位置不同

Xamarin 表单轮播视图 - Android 和 iOS 差异

以编程方式将视图添加到 Xamarin.Android C# 中的 GridLayout

Xamarin 中 ListView 的不同视图形式 Android 和 UWP

如何在 Xamarin 中使用具有 android/IOS 特定视图的控制模板

如何在 Xamarin Android 中剪辑滚动视图的边界