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

详解xamarin Android 实现ListView万能适配器,第1张

概述详解xamarinAndroid实现ListView万能适配器早些时候接触xamarinAndroid的列表,写了很多ListView的Adapter,建一个ListView就写一个Adapter,每一个Adapter里面还有去写一个ViewHolder的类来优化,自从看了hongyang博

详解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万能适配器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1144793.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存