Xamarin Android OnOptionsItemSelected async

时间:2016-01-20 02:18:21

标签: c# listview asynchronous xamarin

我是Xamarin和Android开发的新手(来自Web MVC背景),所以我只想尝试一些东西来学习它。无论如何,我也试图在C#中的异步任务功能上做得更好,我似乎遇到了问题。

我有一个刷新菜单项,点击后会调用天气API来获取最新信息,然后我想用这些数据更新ListView。我可以毫无问题地获取最新数据,解析数据,并为列表项创建数组。问题是,无论我如何尝试更新适配器或列表视图,都不会发生任何事情。经过调试和单步执行后,似乎只要它遇到适配器的Clear方法就会停止调试并继续运行应用程序(没有错误消息或我能看到的任何内容)。

这是我的代码:

public override bool OnOptionsItemSelected(IMenuItem item)
    {
        var id = item.ItemId;

        // refresh
        if (id == Resource.Id.refresh_weather)
        {
            SetForecastInfo();
        }

        return base.OnOptionsItemSelected(item);
    }

而且:

public async Task SetForecastInfo()
    {
        var task = new FetchWeatherTask();

        var data = await task.ExecuteAsync();

        string[] newData = new string[7];

        for (var i = 0; i < 7; i++)
        {
            // I make the new strings for the list here
        }

        _listItems = newData;

        _forecastAdapter.Clear();
        _forecastAdapter.AddAll(new List<string>(_listItems));
    }

我在_forecastAdapter.Clear()上设置了一个断点并检查了所有变量,一切看起来都很完美,并且拥有所需的所有数据。虽然如果我将鼠标悬停在Clear()上,Visual Studio Debugger会说&#34; Unknown Member:Clear&#34;然后按F10跳到下一个AddAll调用,当我这样做时,它继续执行,因此AddAll方法永远不会被调用。没有错误消息打印到日志中。

这是因为我无法在OnOptionsItemSelected内等待SetForecastInfo吗?我是否完全错了(可能很好,只是想学习)?任何帮助表示赞赏!

PS:_forecastAdapter在应用首次加载时效果很好。它现在只是设置为静态数据,只是试图让它在刷新时更新以测试一些东西。

1 个答案:

答案 0 :(得分:0)

我最终通过摆脱所有异步内容并尝试使用静态数据重新填充它来解决这个问题。这样做给了我Java.Lang.UnsupportedOperationException.在做了一些关于为什么会在ArrayAdapter上抛出异常的研究之后我找到了答案。

我最初使用普通静态数组创建了ArrayAdapter。当它试图运行clear方法时,它无法删除这些项目。切换到使用允许动态删除和添加元素的集合(如List<string>),当我第一次初始化ArrayAdapter时修复此问题。绝对是我原本应该抓住的东西。