如何在Xamarin Android中填充ListView?

时间:2017-04-08 21:38:17

标签: c# android xamarin.android

我有一个Web Api,它从SQL数据库中检索数据。我需要在xamrin中使用web api for android。我不知道如何根据按钮点击事件调用GET和Post方法。现在使用我编写的代码,当我单击按钮填充列表时,我在应用程序中得到一个空白屏幕。我的API在Postman中运行良好,但我不知道如何使它在Xamarin Android App上运行。

我在我的解决方案中创建了一个单独的库,它包含我的模型和API服务类。

Web API获取列表方法

// GET: api/Books
[HttpGet]
[Route("api/books")]
public IHttpActionResult Get()
{
  IEnumerable<BookDTO> books;
  books = from b in db.Books
    select new BookDTO()
    {
       Id = b.Id,
       Title = b.Title,
       AuthorName = b.Author.Name
    };
       return Ok(books);
 } 

API服务类

public static async Task<BookDTO> GetBooks()
{
    var client = new HttpClient();

    var msg = await client.GetAsync(url);

    if (msg.IsSuccessStatusCode)
    {
        using (var stream = await msg.Content.ReadAsStreamAsync())
        {
            using (var streamReader = new StreamReader(stream))
            {
                var str = await streamReader.ReadToEndAsync();
                var obj = JsonConvert.DeserializeObject<BookDTO>(str);
                return obj;
            }
        }
    }
    return null;
}

MainActivity.cs

public class MainActivity : Activity
{
static readonly List<string> _bookTitles = new List<string>();
private ListView _list;

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

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);

    // Get the button from the layout Resource and attach an event to it
    Button getBooks = FindViewById<Button>(Resource.Id.GetBooks);
    _list = FindViewById<ListView>(Resource.Id.listView1);


    getBooks.Click += async (sender, e) =>
    {
        var books = await BooksApiService.GetBooks();
        ShowTitles(books);
    };
}
    private void ShowTitles(BookDTO books)
    {
        _bookTitles.Clear();
        foreach (var book in books.Title)
        {
            _bookTitles.Add(book.ToString());
        }

    }

2 个答案:

答案 0 :(得分:2)

您的Web API方法的返回类型为testImgView.setImageURI(Uri.parse(imageUri)); 。这意味着您将IEnumerable书籍列表返回到客户端应用程序。 做出这些微小的改变:

API服务类

IEnumerable<BookDTO>

将任务的返回类型更改为public static async Task<IEnumerable<BookDTO>> GetBooks() { var client = new HttpClient(); ,如上所示。

IEnumerable<BookDTO>

将要反序列化的类型从if (msg.IsSuccessStatusCode) { using (var stream = await msg.Content.ReadAsStreamAsync()) { using (var streamReader = new StreamReader(stream)) { var str = await streamReader.ReadToEndAsync(); var obj = JsonConvert.DeserializeObject<IEnumerable<BookDTO>>(str); return obj; } } } 更改为BookDTO,如上所示。

<强> MainActivity.cs

IEnumerable<BookDTO>

ShowTitles()应该以{{1​​}}作为参数,因为您可能想要遍历每本书并检索相应的标题并将其添加到 _bookTitles 列表。

 private void ShowTitles(IEnumerable<BookDTO> books)
    {
       ...
        /*Change this block accordingly.*/
        foreach (var book in books)
        {                 
            _bookTitles.Add(book.Title.ToString());
        }    
      ...
    }

但是,上面的部分将保持原样,因为您使用了 var 类型,这意味着编译器将根据用途确定变量的显式类型。

答案 1 :(得分:1)

  

我的API在Postman中运行良好,但我不知道如何使它在Xamarin Android App上运行。

问题是,在服务器端,您返回IEnumerable<BookDTO>个对象。但在客户端,您使用BookDTO将其反序列化为var obj = JsonConvert.DeserializeObject<BookDTO>(str);对象。

请尝试使用IEnumerable<BookDTO>

将其反序列化为var obj = JsonConvert.DeserializeObject<IEnumerable<BookDTO>>(str);

如果问题仍然存在,请调试以str

检查var str = await streamReader.ReadToEndAsync();的内容