大叔也说Xamarin~Android篇~ListView里的Click事件并获取本行的其它元素

简介: 原文:大叔也说Xamarin~Android篇~ListView里的Click事件并获取本行的其它元素我原创,我贡献,我是仓储大叔 本篇大叔原创,本着对技术的热爱去研究它,把成果分享给国人!大叔始终相信一句话:你只有选择一个感兴趣的工作,你才能更好的发挥你的潜力,而这一切都建立在你不断研究,不断钻研的前提下。
原文: 大叔也说Xamarin~Android篇~ListView里的Click事件并获取本行的其它元素

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

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

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

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

研究在继续...

目录
相关文章
|
3月前
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
31 2
|
2天前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
20 0
|
4月前
|
XML Java Android开发
Android App事件交互Event之模仿京东App实现下拉刷新功能(附源码 可直接使用)
Android App事件交互Event之模仿京东App实现下拉刷新功能(附源码 可直接使用)
33 0
Android App事件交互Event之模仿京东App实现下拉刷新功能(附源码 可直接使用)
|
4月前
|
XML Java Android开发
Android App事件交互中辨别缩放与旋转手指的讲解与实战(附源码 可直接使用)
Android App事件交互中辨别缩放与旋转手指的讲解与实战(附源码 可直接使用)
37 0
|
4月前
|
XML Java Android开发
Android App事件交互中区分点击和长按动作以及识别手势滑动方向的讲解及实战(附源码 可直接使用)
Android App事件交互中区分点击和长按动作以及识别手势滑动方向的讲解及实战(附源码 可直接使用)
61 0
|
4月前
|
XML Java Android开发
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
43 0
|
4月前
|
XML 监控 Java
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
Android App开发之事件交互Event中检测软键盘和物理按键讲解及实战(附源码 演示简单易懂)
130 0
|
6月前
|
开发工具 Android开发 iOS开发
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
使用vs2019学习xamarin时,创建新程序。使用模拟器真机等测试都报错如下图错误: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-de8ce5fd.png?x-cos-security-token=r4KyZDEowPT0kGTL0LqE8EnwfN1Nzexadb05dcffed3939ff8d7591c528c01706nvpGSE93QwHpZM8NwhJNTZctNRQa0l3KDhEnqj8P7d8t
63 0
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
|
Java C# Android开发
.NET(WinCE、WM)开发转Android开发 ——Xamarin和Smobiler对比
WinCE从1995年诞生至今,已有20多年的发展历史,行业成熟方案覆盖范围广,从车载、工控、手持机都有涉及,且方案成熟。 近些年,Android以后来居上的态势,逐渐渗透至各行业领域,硬件手持大厂也把产品线重心向Android手持迁移,基于Android的行业解决方案越来越成熟,WinCE的开发人才流失,在WinCE解决方案上吃老本的企业寻求转型。
|
Web App开发 测试技术 Android开发
xamarin开发android收集的一些工具
原文:xamarin开发android收集的一些工具 xamarin开发android收集的一些工具 工欲善其事,必先利其器,从16年下半年开始做xamarin相关的开发,平时使用的一些工具和google插件给大家分享一下,都有下载地址,持续更新。
1487 0