日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
xamarinAndroid如何實(shí)現(xiàn)ListView萬能適配器-創(chuàng)新互聯(lián)

小編給大家分享一下xamarin Android如何實(shí)現(xiàn)ListView萬能適配器,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為老邊等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及老邊網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站建設(shè)、老邊網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

本章主要分為以下三點(diǎn):

  • 打造通用的ViewHolder優(yōu)化ListView性能

  • 使用泛型Adapter適應(yīng)不同布局的ListView

  • C#委托和Java匿名內(nèi)部類的比較

打造通用的ViewHolder優(yōu)化ListView性能

 public class ViewHolder:Java.Lang.Object
  {
    private SparseArray Views;
     View ConvertView;
    private Context context ;
     int mPosition;
    private ViewHolder(Context _context,ViewGroup parent ,int itemLayoutId,int position)
    {
      this.mPosition = position;
      Views = new SparseArray();
      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(int viewId) where T :View
    {
      View view = Views.Get(viewId);
      if (view == null)
      {
        view = ConvertView.FindViewById(viewId);
        Views.Put(viewId,view);
      }
      return (T)view;
    }
    public View GetConvertView()
    {
      return ConvertView;
    }
    /// 
    /// 給TextView 設(shè)置文本
    /// 
    /// 
    /// 
    /// 
    public ViewHolder SetText(int viewId ,string text)
    {
      TextView view = GetView(viewId);
      view.Text = text;
      return this;
    }

    /// 
    /// 給ImageView 設(shè)置圖片
    /// 
    public ViewHolder SetImageBitMap(int viewId , Bitmap bm)
    {
      ImageView view = GetView(viewId);
      view.SetImageBitmap(bm);
      return this;
    }
  }

稍微解釋一下:

ViewHolder的構(gòu)造方法中初始化變量,并將ListView的布局view的Tag設(shè)置成viewholder的實(shí)例
Get方法使用單例模式初始化ViewHolder
GetView泛型方法獲取ListView布局中的空間
SetText、SetImageBitMap給一些常用的控件復(fù)值

使用泛型Adapter適應(yīng)不同布局的ListView

CommonAdapter是一個(gè)泛型的基類,一些重復(fù)的重寫方法都在這個(gè)基類,然后我們寫一個(gè)子類繼承這個(gè)CommonAdapter,就簡(jiǎn)化了很多代碼

 public abstract class CommonAdapter :BaseAdapter
  {
    Context mContext;
     List mData;
     int mItemLayoutId;
    public CommonAdapter(Context context, List 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);
    }
  }

寫一個(gè)newsAdapter繼承CommonAdapter,只需要將賦值的代碼寫在重寫方法convert里面極客,這樣就簡(jiǎn)化了很多的代碼

 public class NewsAdapter : CommonAdapter
  {
    public NewsAdapter(Context context, List 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匿名內(nèi)部類的比較

看來上面的例子,雖然簡(jiǎn)化了很多代碼,但是每個(gè)ListView還是得新建一個(gè)Adapter,看來hongyang大神的博客在java中用匿名內(nèi)部類實(shí)現(xiàn)一個(gè)Adapter萬能通用,但是c#中沒有匿名內(nèi)部?jī)?nèi)的概念,這就尷尬了。。。。。

c#中雖然沒有這種概念,但語言是相通的,但是委托可以實(shí)現(xiàn)。萬能通用的adapter代碼如下:

 public class Common1Adapter : BaseAdapter
  {
    Context mContext;
    List 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 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;
    }
  }
}

在使用時(shí),只需要在Activity中注冊(cè)O(shè)nGetView 事件,這樣多個(gè)ListView的Adapter就只需要一個(gè)通用的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 list_news = new List() {
        new Adaptes.NewsViewModel () { NewsID =1,Title="測(cè)試標(biāo)題124578cdascdas",Desc ="測(cè)acdsdas試內(nèi)內(nèi)容10c2da4s內(nèi)容10c2da4s內(nèi)容10c2da4s容10c2da4sc5das4cdas"},
        new Adaptes.NewsViewModel () { NewsID =2,Title="cascascda24578cdascdas",Desc ="測(cè)dasc試內(nèi)容10c2da4s內(nèi)容10c2da4s內(nèi)容10c2da4s內(nèi)容10c2da4sc5das4cdas"},
      };
      Common1Adapter adapter = new Adaptes.Common1Adapter(this, list_news, Resource.Layout.item_listview_news);
      adapter.OnGetView += OnGetView;
      lv_news.Adapter = adapter;

以上是“xamarin Android如何實(shí)現(xiàn)ListView萬能適配器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


文章名稱:xamarinAndroid如何實(shí)現(xiàn)ListView萬能適配器-創(chuàng)新互聯(lián)
文章鏈接:http://www.dlmjj.cn/article/pjgie.html