Xamarin.Android CommonAdapter+ViewHolder

来源:互联网 发布:网络本科学位 编辑:程序博客网 时间:2024/06/01 03:58

写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