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();
}
Adapter的泛型的更多相关文章
- 9.代码抽取(adapter)
1 抽取Adapter 共性的方法 2 把getView方法里 和holder相关的逻辑 摘取到Holder代码中 3 把Holder 相关的代码 抽取到BaseHolder中 4 把ada ...
- (转载)Android快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup
[置顶] [Android]快速开发偷懒必备,一句话搞定所有ViewGroup的Adapter . 支持自定义ViewGroup 标签: androidAdapter快速开发0耦合 2016-12-1 ...
- Android学习之基础知识五—RecyclerView(滚动控件)
RecyclerView可以说是增强版的ListView,不仅具有ListVIew的效果,还弥补许多ListView的不足. 一.RecyclerView的基本用法 与百分比布局类似,Recycler ...
- RecyclerView的刷新和加载更多
1.RecyclerView :出现也不知道多久了,没怎么使用过,上次写的笔记乱七八糟的,再次仔细的整理下. 使用需加入依赖 compile 'com.android.support:recyc ...
- 通用Adapter设计,SparseArray+泛型+回调的使用
看到题目,我相信聪明的各位已经有一定想法了. 一个Adapter,最简单的优化就是使用泛型,他可以省去非常多的代码,不过在此之上,我们还可以继续优化,优化他的好基友是:ViewHolder. 在过去, ...
- ListView和Adapter数据适配器的简单介绍
ListView 显示大量相同格式数据 常用属性: listSelector listView每项在选中.按下等不同状态时的Drawable divider ...
- Adapter的封装之路
原文:Adapter的封装之路 一.几种常见列表效果: 假如要用RecyclerView实现下面的几种效果,你会如何实现呢? 效果1:单布局效果 效果2:多布局效果 有多种Item布局 效果3 ...
- adapter用法
Android之Adapter用法总结 1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(ListView,GridView) ...
- 转载《Android Adapter简单总结》
1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(List View,Grid View)等地方都需要用到Adapter.如下 ...
随机推荐
- USB 3.0规范中译本 第3章 USB 3.0体系结构概览
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章呈现USB 3.0体系结构和关键概念的概览.USB 3.0与前面版本的USB类似,因为它是线缆总线,支持 ...
- spring+aspectJ的实现
AspectJ:(Java社区里最完整最流行的AOP框架) spring自身也有一套AOP框架,但相比较于AspectJ,更推荐AspectJ 在Spring2.0以上版本中,可以使用基于Aspect ...
- Html Vedio标签全屏
http://ask.csdn.net/questions/221701 http://www.zhangxinxu.com/wordpress/2010/03/every-browser-suppo ...
- android生成分享长图而且加入全图水印
尊重他人的劳动成果.转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/65938021. 本文出自:[gengqiquan的博客] 领导近 ...
- Go语言学习(十)bytes包处理字节切片
bytes包提供了对字节切片进行读写操作的一系列函数 字节切片处理的函数比較多,分为基本处理函数,比較函数,后缀检查函数,索引函数,切割函数, 大写和小写处理函数和子切片处理函数等. 1.字节切片基本 ...
- one hot 编码的实现
one hot 编码,针对的是类别性属性(categorical),类别型属性可以为特征向量中的任一属性,比如性别(one hot 编码的意义在于,属性之间不具有数值上大小的区别,在对最后结果的影响上 ...
- 【a802】最少转弯问题
Time Limit: 10 second Memory Limit: 2 MB 问题描述 给出一张地图,这张地图被分为n*m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通 ...
- findbugs静态代码分析工具使用教程
FindBugs 是一个静态分析工具,很多程序猿都在使用,再次详细列出findbugs的使用教程,希望对大家有帮助. 1 安装 FindBugs通过检查类文件或 JAR文件,将字节码与一组缺陷模式进行 ...
- push的时候隐藏底部的tabbar
push的时候隐藏底部的tabbar #import "mainNavigationControllers.h" @interface mainNavigationControll ...
- 【codeforces 782C】Andryusha and Colored Balloons
[题目链接]:http://codeforces.com/contest/782/problem/C [题意] 给你一棵树 让你满足要求 ->任意相连的3个节点的颜色不能相同 的情况下进行染色 ...