一、前言

今天用了一下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. App测试

    (1)App独特测试点: 客户端兼容性测试:系统版本.不同深度定制的rom.屏幕分辨率.中断测试.安装.卸载.升级.对其他程序的干扰等 需要的一些工具: appnium / lr /  jmeter ...

  2. HTML5- Canvas入门(四)

    前几章我们学习了矩形.多边形.圆形.曲线等图形的绘制,今天来学习下更简单一些的文本绘制及其各种功能方法. 在canvas中我们可以通过 strokeText() 和 fillText() 来绘制描边文 ...

  3. Spring:源码解读Spring IOC原理

    Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...

  4. SqlServer英文单词全字匹配

    环境:Vs2013+Sql Server2012 问题:现在数据库记录如下: Sentence列保存的是英文的句子,我现在想找出所有包含“I”(单词)的句子,如果我用 Sentence like '% ...

  5. Atitit 分区后的查询  mysql分区记录的流程与原理

    Atitit 分区后的查询  mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...

  6. Uiautomator 2.0之BySelector类学习小记

    1. BySelector与By静态类 1.1 BySelector类为指定搜索条件进行匹配UI元素, 通过UiDevice.findObject(BySelector)方式进行使用. 1.2 By类 ...

  7. Security7:View Usage

    一,在Database level上,主要有 sys.database_principals, sys.database_permissions 和 sys.database_role_members ...

  8. SQL联合主键 查重

    2014年最后一天,今天在给数据库导入数据的时候,遇到一个问题,就是联合主键去重. 事情是这样的,现有一个表M,我想找个表中导入了许多数据,并需要将字段A(int)和B(int)联合设置为主键. 但是 ...

  9. 深入理解javascript函数系列第四篇——ES6函数扩展

    × 目录 [1]参数默认值 [2]rest参数 [3]扩展运算符[4]箭头函数 前面的话 ES6标准关于函数扩展部分,主要涉及以下四个方面:参数默认值.rest参数.扩展运算符和箭头函数 参数默认值 ...

  10. eclipse导入web项目之后项目中出现小红叉解决办法

    项目中有小红叉我遇到的最常见的情况: 1.项目代码本身有问题.(这个就不说了,解决错误就OK) 2.项目中的jar包丢失.(有时候eclipse打开时会出现jar包丢失的情况,关闭eclipse重新打 ...