Xamarin.Android之Spinner的简单探讨

一、前言

今天用了一下Spinner这个控件,主要是结合官网的例子来用的,不过官网的是把数据写在Strings.xml中的,

某种程度上,不是很符合我们需要的,比较多的应该都是从数据库读出来,绑定上去的。下面是官网的例子:

https://developer.xamarin.com/guides/android/user_interface/spinner/

二、来个简单的Demo

新建一个类 MyType.cs

 1     public class MyType
 2     {
 3         public int TypeId { get; set; }
 4
 5         public string TypeName { get; set; }
 6
 7         public override string ToString()
 8         {
 9             return TypeId + "-" + TypeName;
10         }
11     }

再来点数据

 1     public static class DB
 2     {
 3         public static List<MyType> Types { get; private set; }
 4
 5         static DB()
 6         {
 7             Types = new List<MyType>();
 8             Types.Add(new MyType { TypeId = 1, TypeName = "type1" });
 9             Types.Add(new MyType { TypeId = 2, TypeName = "type2" });
10             Types.Add(new MyType { TypeId = 3, TypeName = "type3" });
11             Types.Add(new MyType { TypeId = 4, TypeName = "type4" });
12         }
13     }

最后写个Adapter,我们自定义的Adapter都需要继承BaseAdapter

 1     public class MyTypeAdapter : BaseAdapter<MyType>
 2     {
 3         private readonly Activity _context;
 4         private readonly IList<MyType> _types;
 5
 6         public MyTypeAdapter(Activity context, IList<MyType> types)
 7         {
 8             this._context = context;
 9             this._types = types;
10         }
11
12         public override MyType this[int position]
13         {
14             get
15             {
16                 return this._types[position];
17             }
18         }
19
20         public override int Count
21         {
22             get
23             {
24                 return this._types.Count;
25             }
26         }
27
28         public override long GetItemId(int position)
29         {
30             return position;
31         }
32
33         public override View GetView(int position, View convertView, ViewGroup parent)
34         {
35             View view = convertView;
36             if (view == null)
37             {
38                 view = this._context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, null);
39             }
40
41             view.FindViewById<TextView>(Android.Resource.Id.Text1).Text = this._types[position].ToString();
42             return view;
43         }
44     }

到这里,会发现有好几个重写的方法!!这些方法是直接通过实现抽象类生成的,然后自己去完善每个方法。

既然都这样了,那就果断去看看这个BaseAdapter是干嘛的

 1     //
 2     // Summary:
 3     //     Common base class of common implementation for an Android.Widget.Adapter that
 4     //     can be /// used in both Android.Widget.ListView (by implementing the specialized
 5     //     /// Android.Widget.IListAdapter interface} and Android.Widget.Spinner (by implementing
 6     //     the /// specialized Android.Widget.ISpinnerAdapter interface.
 7     //
 8     // Type parameters:
 9     //   T:
10     //     To be added.
11     //
12     // Remarks:
13     //     ///
14     //     Common base class of common implementation for an Android.Widget.Adapter that
15     //     can be /// used in both Android.Widget.ListView (by implementing the specialized
16     //     /// Android.Widget.IListAdapter interface} and Android.Widget.Spinner (by implementing
17     //     the /// specialized Android.Widget.ISpinnerAdapter interface. ///
18     //     ///
19     //     /// /// [Android Documentation] /// ///
20     //     ///
21     [DefaultMember("Item")]
22     [Register("android/widget/BaseAdapter", DoNotGenerateAcw = true)]
23     public abstract class BaseAdapter<T> : BaseAdapter
24     {
25         [Register(".ctor", "()V", "")]
26         public BaseAdapter();
27         public BaseAdapter(IntPtr handle, JniHandleOwnership transfer);
28
29         public abstract T this[int position] { get; }
30
31         public override Java.Lang.Object GetItem(int position);
32     }

可以看到这个主要就是给ListView和Spinner用的。主要的还是它继承了BaseAdapter这个抽象类(下面的,我是去掉了注释的,方便看)

 1     public abstract class BaseAdapter : Java.Lang.Object, IListAdapter, ISpinnerAdapter, IAdapter, IJavaObject, IDisposable
 2     {
 3         public BaseAdapter();
 4         protected BaseAdapter(IntPtr javaReference, JniHandleOwnership transfer);
 5         public abstract int Count { get; }
 6         public virtual bool HasStableIds { get; }
 7         public virtual bool IsEmpty { get; }
 8         public virtual int ViewTypeCount { get; }
 9         protected override IntPtr ThresholdClass { get; }
10         protected override Type ThresholdType { get; }
11         public virtual bool AreAllItemsEnabled();
12         public virtual View GetDropDownView(int position, View convertView, ViewGroup parent);
13         public abstract Java.Lang.Object GetItem(int position);
14         public abstract long GetItemId(int position);
15         public virtual int GetItemViewType(int position);
16         public abstract View GetView(int position, View convertView, ViewGroup parent);
17         public virtual bool IsEnabled(int position);
18         public virtual void NotifyDataSetChanged();
19         public virtual void NotifyDataSetInvalidated();
20         public virtual void RegisterDataSetObserver(DataSetObserver observer);
21         public virtual void UnregisterDataSetObserver(DataSetObserver observer);
22
23         public static class InterfaceConsts
24         {
25             public const int IgnoreItemViewType = -1;
26             public const int NoSelection = int.MinValue;
27         }
28     }

可以看到,我们在自定义Adapter时,自动实现的方法,有好几个是在这里面的!!!

具体每个方法是干嘛的,就看看API吧!

https://developer.xamarin.com/api/type/Android.Widget.BaseAdapter/

下面来看看我们的Activity:

 1 [Activity(Label = "SpinnerActivity",MainLauncher =true)]
 2     public class SpinnerActivity : Activity
 3     {
 4         protected override void OnCreate(Bundle savedInstanceState)
 5         {
 6             base.OnCreate(savedInstanceState);
 7
 8             // Create your application here
 9             SetContentView(Resource.Layout.spinnerlayout);
10
11             var typesSpinner = FindViewById<Spinner>(Resource.Id.typesSpinner);
12
13             typesSpinner.Adapter = new Models.MyTypeAdapter(this, Models.DB.Types);
14
15             typesSpinner.ItemSelected += typesSpinner_ItemSelected;
16         }
17
18         private void typesSpinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
19         {
20             Spinner spinner = (Spinner)sender;
21
22             var toast = string.Format(spinner.GetItemAtPosition(e.Position).ToString());
23
24             Toast.MakeText(this, toast, ToastLength.Long).Show();
25         }
26     }

很简单,下面看看效果图

     

但是呢,我记得在原生的开发中,下面这句应该直接是得到一个Object对象,然后通过强制转化就可以得到对应的Model

spinner.GetItemAtPosition(e.Position)

我试过.net下面的强制转化和object获取在转化,都没办法得到想要的效果

都是这个错。

回想刚才的BaseAdapter类,它继承了Java.Lang.Object

所以就直接让我们的MyType去继承这个试试。可以点出来了!!

再来看看选择后的效果图:

OK,达到想要的效果了!!这样我们就可以得到任何我们想要的属性了!!不用只局限一个.ToString()方法了!

下面是MyType类和typesSpinner_ItemSelected方法

 1      public class MyType : Java.Lang.Object
 2     {
 3         public int TypeId { get; set; }
 4
 5         public string TypeName { get; set; }
 6
 7         public override string ToString()
 8         {
 9             return TypeId + "-" + TypeName;
10         }
11     }
 1         private void typesSpinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
 2         {
 3             Spinner spinner = (Spinner)sender;
 4
 5             //var toast = string.Format(spinner.GetItemAtPosition(e.Position).ToString());
 6
 7             var toast = (Models.MyType)spinner.GetItemAtPosition(e.Position);
 8
 9             Toast.MakeText(this, toast.TypeName, ToastLength.Long).Show();
10         }
时间: 2024-08-02 14:46:10

Xamarin.Android之Spinner的简单探讨的相关文章

Xamarin.Android之封装个简单的网络请求类

一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于HttpClient和HttpWebRequest两种方式的封装. 由于对这一块还不是很熟悉,所以可能不是很严谨. 二.先上封装好的代码 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Json

android 之 spinner的简单使用

先看spinner的效果图: 代码: MainActivity package com.mecury.spinnertest; import java.util.ArrayList; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.

用c#开发安卓程序 (xamarin.android)系列之二 简单的聊天程序

networkcomm.net 网络通信框架来自于英国剑桥,其开源版本2.3.1 中自带了一个编写android的例子,可以很好的帮助我们入门. 此示例的功能,是在2个安卓手机上,输入对方的IP和端口,能够实现聊天功能. 把代码放上,供大家一览 using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using

Xamarin.Android再体验之简单的登录Demo

一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是接受客户端的登陆请求,服务器端返回请求的结果 这里的内容比较简单不在啰嗦,直接上代码了: 1 using System.Linq; 2 using System.Web.Mvc; 3 namespace Catcher.AndroidDemo.EasyLogOn.Service.Controller

Xamarin.Android和UWP之MVVM的简单使用(一)

0x01 前言 就目前而言,MVVM可以说是挺流行的,无论是web端还是移动端,web端的主要代表angularjs,avalonjs等, 移动端(xamarin,uwp)的代表应该是mvvmlight,mvvmcross等, 我们的主题是移动端,所以主要讲mvvmlight,mvvmcross,这篇主要讲MvvmLight,下篇讲MvvmCross. 还是以Demo的形式来谈使用. 0x02 简单的MVVM(mvvmlight) Demo 先来个web版最简单的MVVM效果,然后在按xamar

Xamarin.Android之引导页的简单制作

0x01 前言 对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户 APP有些什么功能或者修改了什么bug.新增了什么功能等等等. 下面就用Xamarin.Android来简单实现一下.主要用到的是ViewPager,当然也就离不开Xamarin.Android.Support.v4 如果遇到不能编译的问题,可以参考Xamarin.Android之简单的抽屉布局的出错处理方案. 0x02 页面布局编写 新建一个Android项目 添加几个简单

Xamarin.Android之Splash的几种简单实现

对现在的APP软件来说,基本上都会有一个Splash页面,类似大家常说的欢迎页面.启动界面之类的. 正常来说这个页面都会有一些相关的信息,比如一些理念,Logo,版本信息等 下面就来看看在Xamarin.Android是如何简单实现的吧. 一.新建一个空白Android项目 二.添加一个layout,splash.axml 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:

MVP架构在xamarin android中的简单使用

好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪自己太年轻了,还好是给指定行业的人使用. 重新学习思考之后,再看自己在项目中的某些实现的代码,的确不尽人意,甚至想骂自己. 项目经常改,改来该去,代码一直增加,一个fragment也没什么功能,接近1000行的代码,用region括起来,开看起来还挺整齐的,找的时候就凉了.究其原因,没有一种模式,所

Xamarin.Android绑定库分享

使用Xamarin.Android时,会用到各种第三方库,而这些库基本上是java编写的,要在Xamarin.Android中使用这些库,就需要通过Android Binding Project绑定对应的java库,然后在C#中使用.绑定时,可能需要编写相关的转换规则或者修改对应的java源代码,遇到问题时,可以到Xamarin的官网查看,也可以Google. Xamarin.Android绑定参考文档地址: http://developer.xamarin.com/guides/android