Xamarin.Android之Spinner的简单探讨
一、前言
今天用了一下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的简单探讨的更多相关文章
- [置顶]
xamarin android自定义spinner
以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...
- Xamarin.Android之封装个简单的网络请求类
一.前言 回忆到上篇 <Xamarin.Android再体验之简单的登录Demo> 做登录时,用的是GET的请求,还用的是同步, 于是现在将其简单的改写,做了个简单的封装,包含基于Http ...
- android 之 spinner的简单使用
先看spinner的效果图: 代码: MainActivity package com.mecury.spinnertest; import java.util.ArrayList; import a ...
- Xamarin.Android再体验之简单的登录Demo
一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...
- Xamarin.Android之UI Test简单入门
一.前言 相信Xamarin免费之后会有更多的人加入进来,这也是我一直以来最希望看到的事,更多的人加入到这个社区中,为这个社区贡献自己的一份力量,国内当前还没有一个比较正规或者说是名气比较大的Xama ...
- Xamarin.Android之简单的抽屉布局
0x01 前言 相信对于用过Android版QQ的,应该都不会陌生它那个向右滑动的菜单(虽说我用的是Lumia) 今天就用Xamarin.Android实现个比较简单的抽屉布局.下面直接进正题. 0x ...
- Xamarin Android自定义文本框
xamarin android 自定义文本框简单的用法 关键点在于,监听EditText的内容变化,不同于java中文本内容变化去调用EditText.addTextChangedListener(m ...
- Xamarin android spinner的使用方法
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Xamarin.Android之引导页的简单制作
0x01 前言 对于现在大部分的APP,第一次打开刚安装或更新安装的APP都会有几个引导界面,通常这几个引导页是告诉用户 APP有些什么功能或者修改了什么bug.新增了什么功能等等等. 下面就用Xam ...
随机推荐
- u盘写入Ubuntu后容量变小,恢复方式
具体请参考网址:http://jingyan.baidu.com/article/59703552e754e48fc00740ed.html 经过验证,方法是可以的
- AngularJS SPA Template For Visual Studio
单页面应用程序(SPA)[使用JavaScript.CSS和HTML强大的功能,可以构建一个单页面应用程序(SPAs)],它提供了丰富的用户体验页面.导航技术和AJAX提供必要的功能,而不用重新加载页 ...
- 【腾讯Bugly干货分享】让 CodeReview 这股清流再飞一会儿
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/ToYeT4Y4pzx0ii9Z92fo-Q 作者:刘 ...
- 细说ES7 JavaScript Decorators
开篇概述 在上篇的ES7之Decorators实现AOP示例中,我们预先体验了ES7的Decorators,虽然它只是一个简单的日志AOP拦截Demo.但它也足以让我们体会到ES7 Decorator ...
- 给Mac OS X的“逻辑宗卷组”改名
近日更新了Mac OS X的10.10版本——Yosemite,感觉良好,但当我在打开磁盘工具的时候发现了一个美中不足的地方,磁盘宗卷组的名字居然还是我之前的“Mavericks”,如图: 如何对它进 ...
- Sql Server数据库备份和恢复:原理篇
本文与您探讨为什么Sql Server有完整备份.差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式.完整模式和大容量日志模式这三种恢复模式.本文内容适用于2005以上所有版本的Sql ...
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- FASTJSON
package com.hanqi.test; import java.util.ArrayList;import java.util.Date;import java.util.List; impo ...
- CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- iOS开发——高级技术&本地化与国际化详解
本地化与国际化详解 效果如下: 英语: 中文: 具体实现如下: ...