大(da)叔(shu)也說Xamarin~Android篇~ListView里的Click事件并(bing)獲取本(ben)行的其它元素(su)
我原創,我貢獻,我是倉儲大叔
本篇大叔原創,本著對技術的熱愛去研究它,把成果分享給國人!大叔始終相信一句話:你只有選擇一個感興趣的工作,你才能更好的發揮你的潛力,而這一切都建立在你不斷研究,不斷鉆研的前提下。
Xamarin文章(zhang)在(zai)網(wang)上(shang)比較少,而(er)ListView相關的信息(xi)更好(hao),有(you)限的那么(me)幾個(ge)還(huan)都(dou)說的不清楚,只是(shi)(shi)告訴大家(jia)如何(he)去(qu)完成(cheng)按鈕的事件,而(er)在(zai)事件里(li),如何(he)獲取當(dang)前(qian)行的其(qi)它元素信息(xi)則沒有(you)說明(ming),在(zai)網(wang)絡上(shang)找(zhao)了(le)很(hen)久,沒有(you)收獲,確(que)定還(huan)是(shi)(shi)自己去(qu)研究吧,幸運的是(shi)(shi),最(zui)終(zhong)還(huan)是(shi)(shi)找(zhao)了(le)解決的方法(fa)。
圖像簡單說下
先(xian)看(kan)一下截圖,一個(ge)ListView,它的布局是表(biao)格,每行(xing)(xing)由若(ruo)干個(ge)TextView組成,最后是兩個(ge)Button,我們在(zai)單擊(ji)每行(xing)(xing)按(an)鈕時(shi),需要拿到對應(ying)行(xing)(xing)上的其(qi)它元素的值
訪原生android失敗了
我們(men)在(zai)(zai)網上可以(yi)(yi)(yi)找到的(de)(de)是(shi)Android原(yuan)生環境對(dui)按(an)鈕的(de)(de)實(shi)現(xian)(xian)方(fang)法(fa),即它可以(yi)(yi)(yi)直接(jie)在(zai)(zai)new View.OnClickListener這(zhe)(zhe)個(ge)接(jie)口,并(bing)直接(jie)override Click這(zhe)(zhe)個(ge)方(fang)法(fa),我有時確實(shi)覺得java的(de)(de)語法(fa)怪怪的(de)(de),不成(cheng)體統(tong),感(gan)覺編(bian)譯器應該(gai)是(shi)為(wei)(wei)OnClickListener這(zhe)(zhe)個(ge)接(jie)口動(dong)態建立(li)了一(yi)個(ge)匿名(ming)類,然后由(you)它重寫Click方(fang)法(fa),畢竟,我們(men)認為(wei)(wei)接(jie)口是(shi)不能被(bei)實(shi)例化的(de)(de),呵呵;而在(zai)(zai)xamarin里,如何去重寫,也(ye)建立(li)一(yi)個(ge)類去繼(ji)(ji)承View.OnClickListener,說做就做,不過可惜的(de)(de)是(shi)在(zai)(zai)xamarin里并(bing)沒有一(yi)個(ge)OnClickListener的(de)(de)接(jie)口,因(yin)為(wei)(wei).net的(de)(de)命名(ming)規范(fan)的(de)(de)原(yuan)因(yin),把(ba)這(zhe)(zhe)個(ge)接(jie)口改(gai)名(ming)為(wei)(wei)OnClickListener,我直接(jie)繼(ji)(ji)承它,實(shi)現(xian)(xian)了Click方(fang)法(fa),不過可能的(de)(de)是(shi),ListView的(de)(de)click事件(jian)并(bing)沒有被(bei)相應,所(suo)以(yi)(yi)(yi),我的(de)(de)研究還在(zai)(zai)繼(ji)(ji)續...
public class lvButtonListener : Android.Views.View.IOnClickListener { public void OnClick(View v) { v.FindViewById<TextView>(Resource.Id.hello).Text = "click"; Toast.MakeText(v.Context, "View OnClick2", ToastLength.Short).Show(); } public IntPtr Handle { get { return this.Handle; } } public void Dispose() { this.Dispose(); } }
繼續找資料,按Adapter實現View.IOnClickListener,成功了
新建的類去實現IOnClickListener不(bu)(bu)成功,所以就在(zai)適配器上(shang)直接去實現它,這個代碼也是(shi)從網(wang)上(shang)找的(de),不(bu)(bu)過,所只(zhi)是(shi)說(shuo)了(le)一下(xia)按鈕的(de)處罰,簡單幾(ji)行代碼,沒有(you)說(shuo)明如何(he)獲取(qu)當前行里的(de)元素
/// <summary> /// 適配器(qi) /// </summary> public class Task_InfoListAdapter : BaseAdapter<Task_Info>, Android.Views.View.IOnClickListener { //代(dai)碼 }
實現Click方法,寫你(ni)(ni)自己的(de)(de)(de)邏輯,其(qi)中參數View,表示當(dang)前按鈕所在的(de)(de)(de)View對象,它不包括其(qi)它行(xing)里的(de)(de)(de)元素(su),如TextView你(ni)(ni)在這個View對象上是無(wu)法找到的(de)(de)(de)
/// <summary> /// 單擊某個按鈕(niu)時的事件 /// </summary> /// <param name="v">這個按妞</param> public void OnClick(View v) { switch (v.Id) { case Resource.Id.rechargeBtn: Toast.MakeText(this.context, "充值" + v.Id, ToastLength.Short).Show(); this.context.StartActivity(typeof(RechargeActivity)); break; case Resource.Id.delBtn: Toast.MakeText(this.context, "刪(shan)除(chu)",ToastLength.Short).Show(); break; } }
多嘗試,最終找到解決方法
上面的(de)代碼(ma)(ma)只是告訴我(wo)們你點(dian)擊的(de)是哪個(ge)按鈕(niu),而無法得(de)到當(dang)前按鈕(niu)所在行(xing)(xing)的(de)其它元素,這時我(wo)們使用V.FindViewById<TextView>(Resource.Id.TaskID).Text 這種代碼(ma)(ma)來獲取值是錯誤的(de),因為上面我(wo)已經說過,View這個(ge)對(dui)(dui)象指的(de)是當(dang)前的(de)Button對(dui)(dui)象,而并不(bu)是整個(ge)一行(xing)(xing),在進(jin)行(xing)(xing)觀察(cha)后(hou)(hou),發(fa)現View對(dui)(dui)象里有個(ge)Parent屬性,把(ba)它輸出后(hou)(hou)發(fa)現,它正是我(wo)們的(de)表格行(xing)(xing)對(dui)(dui)象,這時,我(wo)來精神了,看到希望了,繼(ji)續代碼(ma)(ma),list.FindViewById<TextView>(Resource.Id.TaskID).Text,經過測試發(fa)現成(cheng)功了,終于成(cheng)功了,不(bu)容易!
下面(mian)是適配器(qi)的完整(zheng)代碼
/// <summary> /// 適配器 /// </summary> public class Task_InfoListAdapter : BaseAdapter<Task_Info>, Android.Views.View.IOnClickListener { /// <summary> /// 所有(you)UserInof 的(de)數據 /// </summary> List<Task_Info> items; Activity context; public Task_InfoListAdapter(Activity context, IEnumerable<Task_Info> items) : base() { this.context = context; this.items = items.ToList(); } public override long GetItemId(int position) { return position; } public override Task_Info this[int position] { get { return items[position]; } } public override int Count { get { return items.Count; } } /// <summary> /// 系統會呼叫 并且(qie)render. /// </summary> /// <param name="position"></param> /// <param name="convertView"></param> /// <param name="parent"></param> /// <returns></returns> public override View GetView(int position, View convertView, ViewGroup parent) { var item = items[position]; if (convertView == null) { //使用自(zi)訂的UserListItemLayout,這是一(yi)個模版,可(ke)以在外布遍歷它(ta) convertView = context.LayoutInflater.Inflate(Resource.Layout.PartialCurrentTaskList, null); } convertView.FindViewById<TextView>(Resource.Id.TaskID).Text = item.TaskID.ToString(); convertView.FindViewById<TextView>(Resource.Id.ExpectedDate).Text = item.CreateDate.ToString(); convertView.FindViewById<TextView>(Resource.Id.Status).Text = item.Status.ToString(); //得到(dao)listview上的按鈕 var btn = convertView.FindViewById<Button>(Resource.Id.rechargeBtn); var delBtn = convertView.FindViewById<Button>(Resource.Id.delBtn); //listView上按鈕的(de)單擊事(shi)件 btn.SetOnClickListener(this); delBtn.SetOnClickListener(this); return convertView; } /// <summary> /// 單擊某個(ge)按鈕(niu)時的事件(jian) /// </summary> /// <param name="v">這個按妞</param> public void OnClick(View v) { //得到當前(qian)父對象 var list = (v.Parent as View); //同級的(de)其(qi)它對(dui)象 var taskId = list.FindViewById<TextView>(Resource.Id.TaskID).Text; switch (v.Id) { case Resource.Id.rechargeBtn: Toast.MakeText(this.context, "充值(zhi)" + v.Id, ToastLength.Short).Show(); this.context.StartActivity(typeof(RechargeActivity)); break; case Resource.Id.delBtn: Toast.MakeText(this.context, "刪除taskID:" + taskId.ToString(), ToastLength.Short).Show(); break; } } }
如果您覺得本文章對您有幫(bang)助,請幫(bang)頂一(yi)下!
研究在繼續...