我的编程空间,编程开发者的网络收藏夹
学习永远不晚

xamarin Android如何实现ListView万能适配器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

xamarin Android如何实现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;

以上是“xamarin Android如何实现ListView万能适配器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

xamarin Android如何实现ListView万能适配器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

xamarin Android如何实现ListView万能适配器

小编给大家分享一下xamarin Android如何实现ListView万能适配器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本章主要分为以下三点:打造通用的V
2023-05-30

Android ListView万能适配器实例代码

ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义。 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家。 首先有一个自定义的Adapter继承于BaseAdapte
2022-06-06

Android如何实现RecyclerView适配器

这篇文章主要讲解了“Android如何实现RecyclerView适配器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android如何实现RecyclerView适配器”吧!源码地址: G
2023-06-14

java如何实现适配器模式

这篇文章将为大家详细讲解有关java如何实现适配器模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。适配器(Adapter)模式:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不
2023-05-31

android中listview与SQLite结合如何实现记事本功能

这篇文章将为大家详细讲解有关android中listview与SQLite结合如何实现记事本功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。android记事本的demo在网上一搜一大堆,但是大神写的d
2023-05-30

Android如何实现图片显示与屏幕适配

这篇文章主要介绍Android如何实现图片显示与屏幕适配,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android 图片显示与屏幕适配的问题在Android开发中比较头疼的是Android的分辨率问题,那么这里给大
2023-05-30

如何在Android应用中利用ListView实现一个分页功能

今天就跟大家聊聊有关如何在Android应用中利用ListView实现一个分页功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android ListView分页简单实现分页,开发
2023-05-31

怎么在Android 中利用RecyclerView实现一个通用适配器功能

怎么在Android 中利用RecyclerView实现一个通用适配器功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现代码:RViewHolderimport andro
2023-05-31

Android中如何实现SQLite事务处理结合Listview列表显示功能

小编给大家分享一下Android中如何实现SQLite事务处理结合Listview列表显示功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:前面的文章里
2023-05-30

C#适配器模式与装饰器模式如何实现

本篇内容介绍了“C#适配器模式与装饰器模式如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!结构型设计模式创建型设计模式主要是为了解决创
2023-06-30

Android中如何使用自定义view实现ListView下拉的视差特效功能

这篇文章给大家分享的是有关Android中如何使用自定义view实现ListView下拉的视差特效功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、概述:现在流型的APP如微信朋友圈,QQ空间,微博个人展示都
2023-05-30

Android如何利用Sensor实现传感器功能

小编给大家分享一下Android如何利用Sensor实现传感器功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下一、传感器的使用1、传感器的类型:方向传感器::Sensor.TYPE_ORIENTATION加速
2023-06-25

wlan适配器的驱动程序可能出现问题如何解决

本篇内容主要讲解“wlan适配器的驱动程序可能出现问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“wlan适配器的驱动程序可能出现问题如何解决”吧!方法一: 1、首先点击左下角的开始,
2023-07-02

如何在Android中实现一个计时器功能

本篇文章为大家展示了如何在Android中实现一个计时器功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要
2023-06-14

Android studio如何实现简易的计算器功能

这篇文章主要讲解了“Android studio如何实现简易的计算器功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android studio如何实现简易的计算器功能”吧!具体效果如下J
2023-06-30

Android开发如何实现浏览器全屏显示功能

这篇文章给大家分享的是有关Android开发如何实现浏览器全屏显示功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:业务需求:浏览器设置中支持全屏显示的功能。分析:只需要在设置界面上增加是否全屏的che
2023-05-30

Android开发中如何实现一个音乐播放器功能

Android开发中如何实现一个音乐播放器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。需求1:将内存卡中的MP3音乐读取出来并显示到列表当中1.从数据库中查询所有音乐
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录