我有点卡在这里。我有一个显示列表视图的片段。我想加载构成该列表视图异步的项目。我是这样做的:
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// do other stuff here
Task.Run(async () =>
{
_items = await GetItems();
_listView.Adapter = new FooAdapter(Activity, _items);
});
return view;
}
但即使项目已填充,列表视图也永远不会在ui中更新。当我对SwipeRefreshLayout
做同样的事情时,它可以正常工作。
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
_refresher = view.FindViewById<SwipeRefreshLayout>(Resource.Id.refresher);
_refresher.Refresh += async delegate {
_items = await GetItems(true);
_refresher.Refreshing = false;
_listView.Adapter = new RecipeListAdapter(Activity, _items);
};
};
所以最初视图是空的,但是当我下拉时,刷新视图工作,列表被填充,我的列表视图显示出来。我无法弄清楚为什么第一种方法不起作用。
作为参考,我的GetItems看起来像这样:
private async Task<List<Summary>> GetItems(bool clear = false)
{
if (clear)
{
_items.Clear();
}
return await _service.GetItems(Token);
}
答案 0 :(得分:1)
在第二个示例中,您正在调用一个委托,该委托使用await
在设置适配器之前填充_items
变量。但这受到_refresher.Refresh
在第一个示例中,您正在异步运行Task
以获取数据,但是在检索数据之前返回视图。除非某些事情要刷新该视图中的数据,否则它应该如何改变?