写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挂接相应的事件即可