
详解xamarin AndroID 实现ListVIEw万能适配器
早些时候接触xamarin AndroID 的列表,写了很多ListVIEw的Adapter,建一个ListVIEw就写一个Adapter,每一个Adapter里面还有去写一个VIEwHolder的类来优化,自从看了hongyang博客的ListvIEw万能适配器的文章,学习良多,所以就写篇关于xamarin androID ListVIEw通用适配器的文章。
本章主要分为以下三点:
打造通用的VIEwHolder优化ListVIEw性能 使用泛型Adapter适应不同布局的ListVIEw C#委托和Java匿名内部类的比较打造通用的VIEwHolder优化ListVIEw性能
public class VIEwHolder:@R_404_4126@.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,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 @R_404_4126@.Object GetItem(int position) { return null; } public overrIDe long GetItemID(int position) { return position; } public overrIDe VIEw GetVIEw(int position,VIEwGroup parent) { var item = mData[position]; VIEwHolder vIEwHolder = VIEwHolder.Get(mContext,convertVIEw,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,VIEwGroup parent) { return VIEwHolder.Get(mContext,position); } }写一个newsAdapter继承CommonAdapter,只需要将赋值的代码写在重写方法convert里面极客,这样就简化了很多的代码
public class NewsAdapter<T> : CommonAdapter<T> { public NewsAdapter(Context context,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,T item,VIEwHolder vIEwHolder); public event GetVIEwEvent OnGetVIEw; public Common1Adapter(Context context,int itemLayoutID) : base() { this.mContext = context; mData = data; mItemLayoutID = itemLayoutID; } public overrIDe int Count { get { return mData.Count; } } public overrIDe @R_404_4126@.Object GetItem(int position) { return null; } public overrIDe long GetItemID(int position) { return position; } public overrIDe VIEw GetVIEw(int position,position); if (OnGetVIEw != null) return this.OnGetVIEw(position,item,vIEwHolder); return convertVIEw; } }}在使用时,只需要在Activity中注册OnGetVIEw 事件,这样多个ListVIEw的Adapter就只需要一个通用的Adapter就行了
VIEw OnGetVIEw(int position,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 万能适配器的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的详解xamarin Android 实现ListView万能适配器全部内容,希望文章能够帮你解决详解xamarin Android 实现ListView万能适配器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)