一、前言

今天用了一下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. Git生成ssh ksy后进行项目管理

    1.首先你要有一个git账号,然后在网站上Create a New Repository,填好名称后就建立了一个仓库,之后即会出现一些仓库的配置信息... 2.然后你要下载一个git客户端,也可以是m ...

  2. java线程学习

    线程概念 当我问别人什么是线程的时候,别人给我讲了一大堆线程如何创建,如何使用以及若干线程的高深问题,其实作为一个资深菜鸟,我就想问问,什么是线程而已,找了书中的一些概念总结了一下,多线程与操作系统中 ...

  3. wpf 逻辑树与可视化树

    XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性.在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树.逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性.事 ...

  4. Tempdb initial size和dbcc shrinkfile

    在使用sql server时您可能遇到过下面的情况,tempdb的数据文件初始大小为3mb, 随着对tempdb的使用,tempdb文件逐渐变得很大(例如30GB),导致了磁盘空间不足. 此时您需要立 ...

  5. 剑指Offer面试题:23.二叉树中和为某一值的路径

    一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...

  6. CoreData教程

    网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程.内容将包括:创建entity.创建r ...

  7. 《R in Action》读书笔记(3) 数据变换

    MindMapper 原文件

  8. My first makefile to compile multiple C files

    I have three files to compile: main.c, func.c,  func.h The steps: 1   main.c   to   main.o 2   func. ...

  9. Java 的设计模式之一装饰者模式

    刚开始接触装饰者的设计模式,感觉挺难理解的,不够后来花了一个晚上的时间,终于有头绪了 装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行 ...

  10. 修改input框默认黄色背景

    input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill { -webkit-box-shadow: 0 0 ...