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掛接相應的事件即可



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章