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

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

 更新时间:2017年08月18日 09:04:37   作者:张林csdn    我要评论

 

这篇文章主要介绍了详解xamarin Android 实现ListView万能适配器的相关资料,这里主要实现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性能

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

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,就简化了很多代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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里面极客,这样就简化了很多的代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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就行了

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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 万能适配器的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:

原文链接:http://blog.csdn.net/kebi007/article/details/77101947

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值