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(); } 

 

转载于:https://www.cnblogs.com/Lulus/p/8179034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值