一、前言

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

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

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

二、来个简单的Demo

新建一个类 MyType.cs

     public class MyType
{
public int TypeId { get; set; } public string TypeName { get; set; } public override string ToString()
{
return TypeId + "-" + TypeName;
}
}

再来点数据

     public static class DB
{
public static List<MyType> Types { get; private set; } static DB()
{
Types = new List<MyType>();
Types.Add(new MyType { TypeId = , TypeName = "type1" });
Types.Add(new MyType { TypeId = , TypeName = "type2" });
Types.Add(new MyType { TypeId = , TypeName = "type3" });
Types.Add(new MyType { TypeId = , TypeName = "type4" });
}
}

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

     public class MyTypeAdapter : BaseAdapter<MyType>
{
private readonly Activity _context;
private readonly IList<MyType> _types; public MyTypeAdapter(Activity context, IList<MyType> types)
{
this._context = context;
this._types = types;
} public override MyType this[int position]
{
get
{
return this._types[position];
}
} public override int Count
{
get
{
return this._types.Count;
}
} public override long GetItemId(int position)
{
return position;
} public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
if (view == null)
{
view = this._context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem1, null);
} view.FindViewById<TextView>(Android.Resource.Id.Text1).Text = this._types[position].ToString();
return view;
}
}

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

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

     //
// Summary:
// Common base class of common implementation for an Android.Widget.Adapter that
// can be /// used in both Android.Widget.ListView (by implementing the specialized
// /// Android.Widget.IListAdapter interface} and Android.Widget.Spinner (by implementing
// the /// specialized Android.Widget.ISpinnerAdapter interface.
//
// Type parameters:
// T:
// To be added.
//
// Remarks:
// ///
// Common base class of common implementation for an Android.Widget.Adapter that
// can be /// used in both Android.Widget.ListView (by implementing the specialized
// /// Android.Widget.IListAdapter interface} and Android.Widget.Spinner (by implementing
// the /// specialized Android.Widget.ISpinnerAdapter interface. ///
// ///
// /// /// [Android Documentation] /// ///
// ///
[DefaultMember("Item")]
[Register("android/widget/BaseAdapter", DoNotGenerateAcw = true)]
public abstract class BaseAdapter<T> : BaseAdapter
{
[Register(".ctor", "()V", "")]
public BaseAdapter();
public BaseAdapter(IntPtr handle, JniHandleOwnership transfer); public abstract T this[int position] { get; } public override Java.Lang.Object GetItem(int position);
}

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

     public abstract class BaseAdapter : Java.Lang.Object, IListAdapter, ISpinnerAdapter, IAdapter, IJavaObject, IDisposable
{
public BaseAdapter();
protected BaseAdapter(IntPtr javaReference, JniHandleOwnership transfer);
public abstract int Count { get; }
public virtual bool HasStableIds { get; }
public virtual bool IsEmpty { get; }
public virtual int ViewTypeCount { get; }
protected override IntPtr ThresholdClass { get; }
protected override Type ThresholdType { get; }
public virtual bool AreAllItemsEnabled();
public virtual View GetDropDownView(int position, View convertView, ViewGroup parent);
public abstract Java.Lang.Object GetItem(int position);
public abstract long GetItemId(int position);
public virtual int GetItemViewType(int position);
public abstract View GetView(int position, View convertView, ViewGroup parent);
public virtual bool IsEnabled(int position);
public virtual void NotifyDataSetChanged();
public virtual void NotifyDataSetInvalidated();
public virtual void RegisterDataSetObserver(DataSetObserver observer);
public virtual void UnregisterDataSetObserver(DataSetObserver observer); public static class InterfaceConsts
{
public const int IgnoreItemViewType = -;
public const int NoSelection = int.MinValue;
}
}

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

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

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

下面来看看我们的Activity:

 [Activity(Label = "SpinnerActivity",MainLauncher =true)]
public class SpinnerActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState); // Create your application here
SetContentView(Resource.Layout.spinnerlayout); var typesSpinner = FindViewById<Spinner>(Resource.Id.typesSpinner); typesSpinner.Adapter = new Models.MyTypeAdapter(this, Models.DB.Types); typesSpinner.ItemSelected += typesSpinner_ItemSelected;
} private void typesSpinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
Spinner spinner = (Spinner)sender; var toast = string.Format(spinner.GetItemAtPosition(e.Position).ToString()); Toast.MakeText(this, toast, ToastLength.Long).Show();
}
}

很简单,下面看看效果图

     

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

spinner.GetItemAtPosition(e.Position)

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

都是这个错。

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

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

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

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

下面是MyType类和typesSpinner_ItemSelected方法

      public class MyType : Java.Lang.Object
{
public int TypeId { get; set; } public string TypeName { get; set; } public override string ToString()
{
return TypeId + "-" + TypeName;
}
}
         private void typesSpinner_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
Spinner spinner = (Spinner)sender; //var toast = string.Format(spinner.GetItemAtPosition(e.Position).ToString()); var toast = (Models.MyType)spinner.GetItemAtPosition(e.Position); Toast.MakeText(this, toast.TypeName, ToastLength.Long).Show();
}

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

  1. [置顶] xamarin android自定义spinner

    以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...

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

    一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于Http ...

  3. android 之 spinner的简单使用

    先看spinner的效果图: 代码: MainActivity package com.mecury.spinnertest; import java.util.ArrayList; import a ...

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

    一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...

  5. Xamarin.Android之UI Test简单入门

    一.前言 相信Xamarin免费之后会有更多的人加入进来,这也是我一直以来最希望看到的事,更多的人加入到这个社区中,为这个社区贡献自己的一份力量,国内当前还没有一个比较正规或者说是名气比较大的Xama ...

  6. Xamarin.Android之简单的抽屉布局

    0x01 前言 相信对于用过Android版QQ的,应该都不会陌生它那个向右滑动的菜单(虽说我用的是Lumia) 今天就用Xamarin.Android实现个比较简单的抽屉布局.下面直接进正题. 0x ...

  7. Xamarin Android自定义文本框

    xamarin android 自定义文本框简单的用法 关键点在于,监听EditText的内容变化,不同于java中文本内容变化去调用EditText.addTextChangedListener(m ...

  8. Xamarin android spinner的使用方法

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

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

    0x01 前言 对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户 APP有些什么功能或者修改了什么bug.新增了什么功能等等等. 下面就用Xam ...

随机推荐

  1. 禁用nested loop join里的spool

    禁用nested loop join里的spool 转载自: https://blogs.msdn.microsoft.com/psssql/2015/12/15/spool-operator-and ...

  2. IDisposable的另类用法

    IDisposable是.Net中一个很重要的接口,一般用来释放非托管资源,我们知道在使用了IDisposable的对象之后一定要调用IDisposable.Dispose()方法,或者使用.Net提 ...

  3. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  4. MySQL MVCC(多版本并发控制)

    概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...

  5. C#设计模式之桥接

    IronMan之桥接 前言 前面的几个篇幅都是在讲"部件"的生产已经简简单单的使用,以后可能要对"部件"进行升级,不是不对它本身升级,是其它方式的升级,可以让它 ...

  6. Visualize The Workshop

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 今天这篇文章是准备瞎扯的.平常工作的时候,我希望尽可能的将一切自动化,让自己尽可能的舒适与懒惰.两个输 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16  过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...

  8. maven profile的使用

    作为一名程序员,在开发的过程中,经常需要面对不同的运行环境(开发环境.测试环境.生产环境.内网环境.外网环境等等),在不同的环境中,相关的配置一般不一样,比如数据源配置.日志文件配置.以及一些软件运行 ...

  9. T型及Fly_by拓扑之应用总结

    前面的文章有分别介绍过T型拓扑及Fly_by拓扑结构,这两种拓扑结构应用最多的应该是在DDR3里面,说到这里,小编又想开始聊聊DDR3的设计了,我想很多人都比较有兴趣. 因为DDR3的设计还是比较复杂 ...

  10. Sql Server系列:数据表操作

    表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...