在Xamarin项目中,Android - 我是Android开发的新手。在处理活动时,在OnCreate
方法中为ListView
设置自定义适配器。
protected async override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView(Resource.Layout.Main);
var listAdapter = new CustomListAdapter(this);
//.................................................
listView = (ListView) FindViewById(Resource.Id.list);
// populate the listview with data
listView.Adapter = listAdapter;
}
在适配器的ctor
中,在异步调用中创建项目列表。
public CustomListAdapter(Activity context) //We need a context to inflate our row view from
: base()
{
this.context = context;
// items is List<Product>
items = await GetProductList();
}
由于Getproducts是异步调用,因此它将异步加载数据。
问题是,一旦我将适配器设置为列表,它将尝试调用适配器的GetView
方法。那时,不会加载项目。所以有一个空例外。
如何处理这种情况。
感谢。
答案 0 :(得分:5)
您无法在构造函数中使用await
。
你可以做几件事。这里最好的IMO是一个单独的异步方法,您可以在创建对象后调用并等待。
var listAdapter = new CustomListAdapter(this);
await listAdapter.InitializeAsync();
另一种选择是使构造函数成为私有的,并有一个异步静态方法来创建实例并初始化它:
public static async Task<CustomListAdapter> CustomListAdapter.CreateAsync(Activity context)
{
var listAdapter = new CustomListAdapter(context);
listAdapter.items = await GetProductList();
return listAdapter;
}
答案 1 :(得分:-1)
也许覆盖getCount,所以如果items仍为null或items为零项,则返回listView大小应为0。
public int getCount() {
return items != null ? items.size() : 0;
}