你的位置:首页 > 操作系统

[操作系统]大叔也说Xamarin~Android篇~ListView里的Click事件并获取本行的其它元素


我原创,我贡献,我是仓储大叔

本篇大叔原创,本着对技术的热爱去研究它,把成果分享给国人!大叔始终相信一句话:你只有选择一个感兴趣的工作,你才能更好的发挥你的潜力,而这一切都建立在你不断研究,不断钻研的前提下。

Xamarin文章在网上比较少,而ListView相关的信息更好,有限的那么几个还都说的不清楚,只是告诉大家如何去完成按钮的事件,而在事件里,如何获取当前行的其它元素信息则没有说明,在网络上找了很久,没有收获,确定还是自己去研究吧,幸运的是,最终还是找了解决的方法。

图像简单说下

先看一下截图,一个ListView,它的布局是表格,每行由若干个TextView组成,最后是两个Button,我们在单击每行按钮时,需要拿到对应行上的其它元素的值


继续找资料,按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;      }    }  }

如果您觉得本文章对您有帮助,请帮顶一下!

研究在继续...