文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-05-30 21:40

关注

小编给大家分享一下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;

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

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯