zoukankan      html  css  js  c++  java
  • Adapter的泛型

    宗旨:GetView方法放在具体的Activity/Fragment里面实现,其他的均可以复用

    /// <summary>
    /// 通用适配器:新建GetViewEvent委托+OnGetView方法,在外部实现,在重写GetView方法中调用
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class CommonAdapter<T> : BaseAdapter<T>
    {
        //要绑定的数据
        private readonly List<T> items;
        //页面上下文
        private readonly Activity context;
        //ListViewItem的布局id
        private readonly int layoutId;
        
        /// <summary>
        /// 委托
        /// </summary>
        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;
        }
    }
    
    /// <summary>
    /// 通用ViewHolder:保存控件,下拉刷新列表时只重新赋值,不再新建控件(节省内存)
    /// Tag属性保证不错位
    /// </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;
        }
    }
    

    MainActivity

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Main);
        ListView listView = FindViewById<ListView>(Resource.Id.id_lv_main);
        List<Student>  StudentsList =new List<Student>();
        StudentsList.Add(new Student()
        {
            Name = "朱泓霖"
        });
        CommonAdapter<Student > comAdapter =
            new CommonAdapter<Student>(this, Resource.Layout.Item, StudentsList);
        comAdapter.OnGetView += comAdapter_OnGetView;
        listView.Adapter = comAdapter;
    }
    
    private View comAdapter_OnGetView(int position, View convertView, ViewGroup parent, Student item, ViewHolder viewHolder)
    {
        //通过ViewHolder获取对象并赋值
        viewHolder.GetView<TextView>(Resource.Id.id_tv_title).Text = item.Name;
        return viewHolder.GetConvertView();
    }
    

     

  • 相关阅读:
    Lua 数组
    javascript debugger
    Lua 字符串
    警告
    Lua中获取table长度
    Lua 运算符
    Lua 函数
    lua if 流程控制
    pairs 和 ipairs 的区别
    Lua 循环
  • 原文地址:https://www.cnblogs.com/Lulus/p/8179034.html
Copyright © 2011-2022 走看看