【发布时间】:2016-12-07 14:49:52
【问题描述】:
如何在 Xamarin.Android 中在 Activity 的 onCreate 上填充 ListView async?
我知道如何在单击按钮时调用异步方法并添加进度条,但是如何对 onCreate 方法执行相同操作?
我需要的是在加载 20.000 个项目的列表时打开活动并显示进度条。
在 Eclipse Java 中,我曾经调用 AsyncTask (onpreexecute ... doinbackgroud ...onpostexecute),但在 Xamarin 中我不知道如何执行此操作。
有这方面的帮助或教程吗?
我使用@Yuri 提供的方法尝试了这种方式,但仍然无法正常工作:
async protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.PulledItemsList);
ActionBar.SetDisplayHomeAsUpEnabled(true);
ActionBar.Title = "Catalog";
_activity = this;
//display your activity indicator and start spin
ProgressDialog progressdialog = new ProgressDialog(this);
progressdialog.SetCancelable(false);
progressdialog.Indeterminate = true;
progressdialog.SetMessage("Loading...");
progressdialog.SetProgressStyle(ProgressDialogStyle.Spinner);
progressdialog.Show();
await Task.Run(() =>
{
fillListView();
})
.ContinueWith((t) =>
{
RunOnUiThread(() =>
{
progressdialog.Hide();
progressdialog.Dismiss();
});
});
}
还有这个方法:
async protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.PulledItemsList);
ActionBar.SetDisplayHomeAsUpEnabled(true);
ActionBar.Title = "Catalog";
_activity = this;
//display your activity indicator and start spin
ProgressDialog progressdialog = new ProgressDialog(this);
progressdialog.SetCancelable(false);
progressdialog.Indeterminate = true;
progressdialog.SetMessage("Loading...");
progressdialog.SetProgressStyle(ProgressDialogStyle.Spinner);
progressdialog.Show();
await Task.Run(() =>
{
RunOnUiThread(() =>
{
fillListView();
});
});
progressdialog.Hide();
progressdialog.Dismiss();
//disable indicator, list loaded
}
而fillListView()函数是:
private void fillListView()
{
var listview = FindViewById<ListView>(Resource.Id.listview);
List<oneimg_twolbl> ItemObjectList = new List<oneimg_twolbl>();
oneimg_twolbl ItemObject = new oneimg_twolbl(0, "", "");
List<Items> Itemlist = Items.SelectFromItems();
if (Itemlist.Count == 0)
{
Toast.MakeText(this, GetString(Resource.String.NoItems), ToastLength.Long);
}
foreach (Items current_item in Itemlist)
{
ItemObject = new oneimg_twolbl(Resource.Drawable.StockQty, current_item.ItemBarcode.ToString().Trim(), current_item.DisplayField.ToString().Trim(), current_item.ItemNum);
ItemObjectList.Add(ItemObject);
}
adapter = new PulledItemList_Adapter(this, ItemObjectList);
listview.Adapter = adapter;
listview.ItemClick += delegate (object sender, AdapterView.ItemClickEventArgs args)
{
Intent i = new Intent(this, typeof(ManageItemsActivity));
oneimg_twolbl clicked_Item = adapter.GetItem_bypos(args.Position);
Items selected_Item = Items.SelectWhereFromItems(clicked_Item.Id);
i.PutExtra("parameter1", ManageItemsActivity.EDITMODE);
i.PutExtra("parameter2", selected_Item.ItemCode);
i.PutExtra("parameter3", selected_Item.ItemNum);
i.PutExtra("Displayfield", selected_Item.DisplayField);
StartActivity(i);
};
}
适配器类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace SocrateMobile.Droid.Adapter
{
class PulledItemList_Adapter : BaseAdapter<oneimg_twolbl>
{
private Activity context;
private List<oneimg_twolbl> AllItemList;
public PulledItemList_Adapter(Activity context, List<oneimg_twolbl> AllItemList)
{
this.AllItemList = AllItemList;
this.context = context;
}
public oneimg_twolbl GetItem_bypos(int position)
{
return AllItemList[position];
}
public override oneimg_twolbl this[int position]
{
get { return AllItemList[position]; }
}
public override int Count
{
get { return AllItemList.Count; }
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
Holder_oneimg_twolbl holder = null;
var view = convertView;
if (view != null)
holder = view.Tag as Holder_oneimg_twolbl;
if (holder == null)
{
holder = new Holder_oneimg_twolbl();
view = context.LayoutInflater.Inflate(Resource.Layout.oneimg_twolbl, null);
holder.Text = view.FindViewById<TextView>(Resource.Id.text_list4_view);
holder.Text2 = view.FindViewById<TextView>(Resource.Id.text_list4_view2);
holder.Image = view.FindViewById<ImageView>(Resource.Id.image_list4_view);
view.Tag = holder;
}
var current_item = AllItemList[position];
holder.Text.Text = current_item.FirstTxt;
holder.Text2.Text = current_item.SecondTxt;
holder.Image.SetImageResource(current_item.FirstImg);
holder.holderId = current_item.Id;
if (!holder.Image.HasOnClickListeners)
{
holder.Image.Click += delegate
{
PulledItemListActivity Itemlistactivity = new PulledItemListActivity();
Itemlistactivity.QtyImageClick(holder.holderId);
};
}
return view;
}
public class Holder_oneimg_twolbl : Java.Lang.Object
{
public TextView Text { get; set; }
public TextView Text2 { get; set; }
public ImageView Image { get; set; }
public int holderId { get; set; }
}
}
}
【问题讨论】:
标签: android listview xamarin android-asynctask xamarin.android