大叔也說Xamarin~Android篇~ListView裡的Click事件並擷取本行的其它元素,xamarinlistview

來源:互聯網
上載者:User

大叔也說Xamarin~Android篇~ListView裡的Click事件並擷取本行的其它元素,xamarinlistview
我原創,我貢獻,我是倉儲大叔

本篇大叔原創,本著對技術的熱愛去研究它,把成果分享給國人!大叔始終相信一句話:你只有選擇一個感興趣的工作,你才能更好的發揮你的潛力,而這一切都建立在你不斷研究,不斷鑽研的前提下。

Xamarin文章在網上比較少,而ListView相關的資訊更好,有限的那麼幾個還都說的不清楚,只是告訴大家如何去完成按鈕的事件,而在事件裡,如何擷取當前行的其它元素資訊則沒有說明,在網路上找了很久,沒有收穫,確定還是自己去研究吧,幸運的是,最終還是找瞭解決的方法。

映像簡單說下

先看一下,一個ListView,它的布局是表格,每行由若干個TextView組成,最後是兩個Button,我們在單擊每行按鈕時,需要拿到對應行上的其它元素的值

訪原生android失敗了

我們在網上可以找到的是Android原生環境對按鈕的實現方法,即它可以直接在new View.OnClickListener這個介面,並直接override Click這個方法,我有時確實覺得java的文法怪怪的,不成體統,感覺編譯器應該是為OnClickListener這個介面動態建立了一個匿名類,然後由它重寫Click方法,畢竟,我們認為介面是不能被執行個體化的,呵呵;而在xamarin裡,如何去重寫,也建立一個類去繼承View.OnClickListener,說做就做,不過可惜的是在xamarin裡並沒有一個OnClickListener的介面,因為.net的命名規範的原因,把這個介面改名為OnClickListener,我直接繼承它,實現了Click方法,不過可能的是,ListView的click事件並沒有被相應,所以,我的研究還在繼續...

 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不成功,所以就在適配器上直接去實現它,這個代碼也是從網上找的,不過,所只是說了一下按鈕的處罰,簡單幾行代碼,沒有說明如何擷取當前行裡的元素

    /// <summary>    /// 適配器    /// </summary>    public class Task_InfoListAdapter : BaseAdapter<Task_Info>, Android.Views.View.IOnClickListener    {     //代碼     }

實現Click方法,寫你自己的邏輯,其中參數View,表示當前按鈕所在的View對象,它不包括其它行裡的元素,如TextView你在這個View對象上是無法找到的

/// <summary>        /// 單擊某個按鈕時的事件        /// </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, "刪除",ToastLength.Short).Show();                    break;            }        }
多嘗試,最終找到解決方案

上面的代碼只是告訴我們你點擊的是哪個按鈕,而無法得到當前按鈕所在行的其它元素,這時我們使用V.FindViewById<TextView>(Resource.Id.TaskID).Text 這種代碼來擷取值是錯誤的,因為上面我已經說過,View這個對象指的是當前的Button對象,而並不是整個一行,在進行觀察後,發現View對象裡有個Parent屬性,把它輸出後發現,它正是我們的表格行對象,這時,我來精神了,看到希望了,繼續代碼,list.FindViewById<TextView>(Resource.Id.TaskID).Text,經過測試發現成功了,終於成功了,不容易!

下面是適配器的完整代碼

    /// <summary>    /// 適配器    /// </summary>    public class Task_InfoListAdapter : BaseAdapter<Task_Info>, Android.Views.View.IOnClickListener    {        /// <summary>        /// 所有UserInof 的資料        /// </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>        /// 系統會呼叫 並且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)            {                //使用自訂的UserListItemLayout,這是一個模版,可以在外布遍曆它                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();            //得到listview上的按鈕            var btn = convertView.FindViewById<Button>(Resource.Id.rechargeBtn);            var delBtn = convertView.FindViewById<Button>(Resource.Id.delBtn);            //listView上按鈕的單擊事件            btn.SetOnClickListener(this);            delBtn.SetOnClickListener(this);            return convertView;        }        /// <summary>        /// 單擊某個按鈕時的事件        /// </summary>        /// <param name="v">這個按妞</param>        public void OnClick(View v)        {            //得到當前父物件            var list = (v.Parent as View);            //同級的其它對象            var taskId = list.FindViewById<TextView>(Resource.Id.TaskID).Text;                       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, "刪除taskID:" + taskId.ToString(), ToastLength.Short).Show();                    break;            }        }    }

如果您覺得本文章對您有協助,請幫頂一下!

研究在繼續...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.