大叔也說Xamarin~Android篇~ListView裏的Click事件並獲取本行的其它元素

原文: 大叔也說Xamarin~Android篇~ListView裏的Click事件並獲取本行的其它元素

我原創,我貢獻,我是倉儲大叔

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

Xamarin文章在網上比較少,而ListView相關的信息更好,有限的那麼幾個還都說的不清楚,只是告訴你們如何去完成按鈕的事件,而在事件裏,如何獲取當前行的其它元素信息則沒有說明,在網絡上找了好久,沒有收穫,肯定仍是本身去研究吧,幸運的是,最終仍是找了解決的方法。java

圖像簡單說下

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

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

    /// <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,通過測試發現成功了,終於成功了,不容易!post

下面是適配器的完整代碼測試

    /// <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;
            }
        }
    }

若是您以爲本文章對您有幫助,請幫頂一下!this

研究在繼續...url

相關文章
相關標籤/搜索