全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

详解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: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小时内与您取得联系。