国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解xamarin Android 實現ListView萬能適配器

2019-12-12 02:14:29
字體:
來源:轉載
供稿:網友

詳解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 萬能適配器的實例,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 疏附县| 苍溪县| 珲春市| 彩票| 策勒县| 秦皇岛市| 新干县| 南投县| 武平县| 南郑县| 勃利县| 盱眙县| 榆树市| 新营市| 清苑县| 禄丰县| 平南县| 临朐县| 岳阳市| 吴川市| 五寨县| 建湖县| 罗山县| 万宁市| 潞城市| 南汇区| 老河口市| 资中县| 镇原县| 渭源县| 清水县| 岚皋县| 沙坪坝区| 赤水市| 衡南县| 建宁县| 垫江县| 永胜县| 南投县| 盘锦市| 葫芦岛市|