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