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

 

最新文章

  1. apache配置 php中没有php5apache2_4.dll
  2. Mybatis映射文件
  3. c++中的一些容易混淆的研究
  4. Oracle 安装及其遇到的问题
  5. DirectX 9 SDK安装后在vs2010里编译BaseClasses出错问题解决方法
  6. hdu 3037 Saving Beans
  7. 《Java程序设计》第三周学习总结
  8. mongoDB数据库备份
  9. cacti yum快速部署
  10. 关于MapReduce单词统计的例子:
  11. XML的SelectNodes使用方法以及XPath
  12. 在window系统下配置login.sql
  13. Windows下安装Django及WEB服务启动
  14. UIView 视图切换
  15. iOS开发之iOS程序的启动过程
  16. 纳税服务系统【用户模块之使用POI导入excel、导出excel】
  17. 安卓笔记--Style的继承
  18. 阿里巴巴开源项目汇总-(JAVA)
  19. C# ASP.NET Forms身份认证
  20. NuGet包和功能

热门文章

  1. Java中的${pageContext.request.contextPath}
  2. ios开发多线程一:了解-NSOperation的基本使用
  3. js进阶 11-20 弹出层如何制作
  4. Java多线程系列-线程创建
  5. 每天一个JavaScript实例-处理textarea中的字符成每一行
  6. USACO--2.1The Castle
  7. Windows7系统下安装OpenSSL攻略
  8. 【转】关于python中带下划线的变量和函数 的意义
  9. 怎么实现登录之后跳转到登录之前的页面?SpringMVC+Freemarker
  10. 每天一个JavaScript实例-检測表单数据