详解xamarin Android 实现ListView万能适配器

早些时候接触xamarin Android 的列表,写了很多ListView的Adapter,建一个ListView就写一个Adapter,每一个Adapter里面还有去写一个ViewHolder的类来优化,自从看了hongyang博客的listview万能适配器的文章,学习良多,所以就写篇关于xamarin android ListView通用适配器的文章。
本章主要分为以下三点:
打造通用的ViewHolder优化ListView性能
public class ViewHolder:Java.Lang.Object
{
private SparseArray<View> Views;
View ConvertView;
private Context context ;
int mPosition;
private ViewHolder(Context _context,ViewGroup parent ,int itemLayoutId,int position)
{
this.mPosition = position;
Views = new SparseArray<View>();
ConvertView = LayoutInflater.From(_context).Inflate(itemLayoutId,null);
ConvertView.Tag = this;
}
public static ViewHolder Get(Context context , View convertView,ViewGroup parent ,int itemLayoutId,int position)
{
if (convertView == null)
{
return new ViewHolder(context, parent, itemLayoutId, position);
}
else
{
ViewHolder holder = (ViewHolder)convertView.Tag;
holder.mPosition = position;
return holder;
}
}
public T GetView<T>(int viewId) where T :View
{
View view = Views.Get(viewId);
if (view == null)
{
view = ConvertView.FindViewById<T>(viewId);
Views.Put(viewId,view);
}
return (T)view;
}
public View GetConvertView()
{
return ConvertView;
}
/// <summary>
/// 给TextView 设置文本
/// </summary>
/// <param name="viewId"></param>
/// <param name="text"></param>
/// <returns></returns>
public ViewHolder SetText(int viewId ,string text)
{
TextView view = GetView<TextView>(viewId);
view.Text = text;
return this;
}
/// <summary>
/// 给ImageView 设置图片
/// </summary>
public ViewHolder SetImageBitMap(int viewId , Bitmap bm)
{
ImageView view = GetView<ImageView>(viewId);
view.SetImageBitmap(bm);
return this;
}
}
稍微解释一下:
ViewHolder的构造方法中初始化变量,并将ListView的布局view的Tag设置成viewholder的实例
Get方法使用单例模式初始化ViewHolder
GetView泛型方法获取ListView布局中的空间
SetText、SetImageBitMap给一些常用的控件复值
使用泛型Adapter适应不同布局的ListView
CommonAdapter是一个泛型的基类,一些重复的重写方法都在这个基类,然后我们写一个子类继承这个CommonAdapter,就简化了很多代码
public abstract class CommonAdapter<T> :BaseAdapter
{
Context mContext;
List<T> mData;
int mItemLayoutId;
public CommonAdapter(Context context, List<T> data, int itemLayoutId):base()
{
this.mContext = context;
mData = data;
mItemLayoutId = itemLayoutId;
}
public override int Count
{
get
{
return mData.Count;
}
}
public override Java.Lang.Object GetItem(int position)
{
return null;
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var item = mData[position];
ViewHolder viewHolder = ViewHolder.Get(mContext, convertView, parent, mItemLayoutId, position);
convert(viewHolder,mData[position]);
System.Diagnostics.Debug.Write(position);
return viewHolder.GetConvertView();
}
public abstract void convert(ViewHolder helper, T item);
public ViewHolder GetViewHolder(int position, View convertView, ViewGroup parent)
{
return ViewHolder.Get(mContext, convertView, parent, mItemLayoutId, position);
}
}
写一个newsAdapter继承CommonAdapter,只需要将赋值的代码写在重写方法convert里面极客,这样就简化了很多的代码
public class NewsAdapter<T> : CommonAdapter<T>
{
public NewsAdapter(Context context, List<T> data, int resId) : base(context, data, resId)
{
}
public override void convert(ViewHolder helper, T item)
{
NewsViewModel model = (NewsViewModel)Convert.ChangeType(item, typeof(NewsViewModel));
helper.SetText(Resource.Id.tv_news_title, model.Title);
helper.SetText(Resource.Id.tv_news_id, model.NewsID.ToString());
helper.SetText(Resource.Id.tv_news_desc, model.Desc);
}
}
C#委托和Java匿名内部类的比较
看来上面的例子,虽然简化了很多代码,但是每个ListView还是得新建一个Adapter,看来hongyang大神的博客在java中用匿名内部类实现一个Adapter万能通用,但是c#中没有匿名内部内的概念,这就尴尬了。。。。。
c#中虽然没有这种概念,但语言是相通的,但是委托可以实现。万能通用的adapter代码如下:
public class Common1Adapter<T> : BaseAdapter
{
Context mContext;
List<T> mData;
int mItemLayoutId;
public delegate View GetViewEvent(int position, View convertView, ViewGroup parent, T item, ViewHolder viewHolder);
public event GetViewEvent OnGetView;
public Common1Adapter(Context context, List<T> data, int itemLayoutId) : base()
{
this.mContext = context;
mData = data;
mItemLayoutId = itemLayoutId;
}
public override int Count
{
get
{
return mData.Count;
}
}
public override Java.Lang.Object GetItem(int position)
{
return null;
}
public override long GetItemId(int position)
{
return position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var item = mData[position];
ViewHolder viewHolder = ViewHolder.Get(mContext, convertView, parent, mItemLayoutId, position);
if (OnGetView != null)
return this.OnGetView(position,convertView,parent,item,viewHolder);
return convertView;
}
}
}
在使用时,只需要在Activity中注册OnGetView 事件,这样多个ListView的Adapter就只需要一个通用的Adapter就行了
View OnGetView(int position,View convertView,ViewGroup parent,NewsViewModel model,ViewHolder viewHolder)
{
viewHolder.SetText(Resource.Id.tv_news_title, model.Title);
viewHolder.SetText(Resource.Id.tv_news_id, model.NewsID.ToString());
viewHolder.SetText(Resource.Id.tv_news_desc, model.Desc);
return viewHolder.GetConvertView();
}
List<NewsViewModel> list_news = new List<Adaptes.NewsViewModel>() {
new Adaptes.NewsViewModel () { NewsID =1,Title="测试标题124578cdascdas",Desc ="测acdsdas试内内容10c2da4s内容10c2da4s内容10c2da4s容10c2da4sc5das4cdas"},
new Adaptes.NewsViewModel () { NewsID =2,Title="cascascda24578cdascdas",Desc ="测dasc试内容10c2da4s内容10c2da4s内容10c2da4s内容10c2da4sc5das4cdas"},
};
Common1Adapter<NewsViewModel> adapter = new Adaptes.Common1Adapter<Adaptes.NewsViewModel>(this, list_news, Resource.Layout.item_listview_news);
adapter.OnGetView += OnGetView;
lv_news.Adapter = adapter;
以上就是Android listview 万能适配器的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# listview
# 万能适配器
# 详解Xamarin.Android 利用Fragment实现底部菜单
# Android将Xamarin For VS升级为4.1.0.530版教程
# 基于VSTS的Xamarin.Android持续集成步骤详解
# 只需
# 重写
# 就写
# 简化了
# 是一个
# 看了
# 都在
# 多个
# 子类
# 如有
# 要在
# 这就
# 博客
# 希望能
# 大神
# 并将
# 写了
# 只需要
# 可以实现
# 要将
相关文章:
建站之星IIS配置教程:代码生成技巧与站点搭建指南
网站制作的步骤包括,正确网址格式怎么写?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
非常酷的网站设计制作软件,酷培ai教育官方网站?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
如何快速搭建FTP站点实现文件共享?
高端企业智能建站程序:SEO优化与响应式模板定制开发
php json中文编码为null的解决办法
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何获取免费开源的自助建站系统源码?
如何实现建站之星域名转发设置?
如何在香港免费服务器上快速搭建网站?
如何在香港服务器上快速搭建免备案网站?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何快速搭建高效服务器建站系统?
微信推文制作网站有哪些,怎么做微信推文,急?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
如何通过虚拟主机空间快速建站?
简单实现Android文件上传
如何选择高性价比服务器搭建个人网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
建站之星后台密码遗忘或太弱?如何重置与强化?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
如何续费美橙建站之星域名及服务?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
智能起名网站制作软件有哪些,制作logo的软件?
如何高效生成建站之星成品网站源码?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星×万网:智能建站系统+自助建站平台一键生成
网站企业制作流程,用什么语言做企业网站比较好?
网站制作报价单模板图片,小松挖机官方网站报价?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
宝塔建站无法访问?如何排查配置与端口问题?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
已有域名和空间,如何快速搭建网站?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
怀化网站制作公司,怀化新生儿上户网上办理流程?
北京专业网站制作设计师招聘,北京白云观官方网站?
网页设计网站制作软件,microsoft office哪个可以创建网页?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
建站之星备案是否影响网站上线时间?
如何基于PHP生成高效IDC网络公司建站源码?
临沂网站制作企业,临沂第三中学官方网站?
如何用免费手机建站系统零基础打造专业网站?
建站之星代理费用多少?最新价格详情介绍
建站之星云端配置指南:模板选择与SEO优化一键生成
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
*请认真填写需求信息,我们会在24小时内与您取得联系。