Xamarin.Android CommonAdapter+ViewHolder

写Adapter写到快要吐了的同学看这里,我们来研究在Xamarin.Android里面通用Adapter如何打造

1 说明

鸿洋的一篇文章Android 快速开发系列 打造万能的ListViewGridView 适配器 写的非常深刻,OO思想展示的非常好,文章地址是:

http://blog.csdn.net/lmj623565791/article/details/38902805/

 

看完了如何在Android实现通用Adapter的基础上研究一下Xamarin.Adnroid如何打造

2 Xamarin.Android+CommonAdapter

整体思路和Android实现的一致

A 在CommonAdapter里面

  /// <summary>
    ///     通用适配器
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class CommonAdapter<T> : BaseAdapter<T>
    {
        private readonly List<T> items;
        private readonly Activity context;
        private readonly int layoutId;

        public delegate View GetViewEvent(
            int position, View convertView, ViewGroup parent, T item, ViewHolder viewHolder);

        /// <summary>
        ///     加载item的View事件
        /// </summary>
        public event GetViewEvent OnGetView;


        public CommonAdapter(Activity context, int layoutId, List<T> items)
        {
            this.context = context;
            this.layoutId = layoutId;
            this.items = items;
        }


        public override T this[int position]
        {
            get { return items[position]; }
        }

        public override int Count
        {
            get { return items.Count; }
        }

        public override long GetItemId(int position)
        {
            return position;
        }

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            var item = items[position];
            var view = convertView;
            var viewHolder = ViewHolder.Get(context, convertView, parent, layoutId, position);

            if (OnGetView != null)
                return OnGetView(position, convertView, parent, item, viewHolder);
            return view;
        }
    }

B ViewHolder

原文参考地址:http://blog.csdn.net/sqh001/article/details/45111733

在此基础上我基于自己的需求在Viewholder里面封装了自己的方法

/// <summary>
    ///     通用ViewHolder
    /// </summary>
    public class ViewHolder : Object
    {
        private readonly SparseArray<View> views;
        private int position;
        private readonly View ConvertView;

        public ViewHolder(Activity context, ViewGroup parent, int layoutID, int position)
        {
            this.position = position;
            views = new SparseArray<View>();
            ConvertView = context.LayoutInflater.Inflate(layoutID, null);
            ConvertView.Tag = this;
        }

        //单例模式获取对象实例
        public static ViewHolder Get(Activity context, View convertView,
            ViewGroup parent, int layoutId, int position)
        {
            if (convertView == null)
                return new ViewHolder(context, parent, layoutId, position);
            var holder = (ViewHolder) convertView.Tag;
            holder.position = position;
            return holder;
        }

        public View GetConvertView()
        {
            return ConvertView;
        }


        /// <summary>
        ///     通过ViewID获取控件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="viewId"></param>
        /// <returns></returns>
        public T GetView<T>(int viewId) where T : View
        {
            var view = views.Get(viewId);
            if (view == null)
            {
                view = ConvertView.FindViewById<T>(viewId);
                views.Put(viewId, view);
            }

            return (T) view;
        }



        /// <summary>
        ///     普通ImageView设置图片
        /// </summary>
        /// <param name="viewId"></param>
        /// <param name="bm"></param>
        /// <returns></returns>
        public ViewHolder SetImageBitmap(int viewId, Bitmap bm)
        {
            var view = GetView<ImageView>(viewId);
            if (view != null)
                view.SetImageBitmap(bm);
            return this;
        }
     

        ///     为任意View设置监听
        /// </summary>
        /// <typeparam name="T">View下所有的控件类型</typeparam>
        /// <param name="viewId">控件ID</param>
        /// <param name="widget">控件 View</param>
        /// <param name="listener"></param>
        /// <returns></returns>
        public ViewHolder SetOnClickListener<T>(int viewId, T widget,
            View.IOnClickListener listener) where T : View
        {
            View view = GetView<T>(viewId);
            view.SetOnClickListener(listener);
            return this;
        }
    }

C 如何使用

在相应的Activity中为ListView挂接相应的事件即可



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值