利用Android反射与泛型机制写一个通用的Adapter类
来源:互联网 发布:对象数组的指针 编辑:程序博客网 时间:2024/05/01 09:47
注意点:Android的反射机制有一个问题,就是Class.getDeclaredFields()返回的变量数组与我们定义的类的变量顺序是不一致的.Android是经过了字母顺序排序的.所以我们需要将变量名传入adapter
//定义一个带泛型的抽象类作为基类,T表示数据类,E表示ViewHolder类public abstract class TBaseAdapter<T> extends BaseAdapter{ List<T> mList;//用于存放数据集 LayoutInflater mInflater; Context context; int [] viewIds;//存放控件ID String[] fields;//存放ViewHolder类变量的名字 int layoutId;//布局文件ID Class<?> classOfE;//ViewHolder类 //构造函数 public TBaseAdapter(Context context, List<T> mList) { // TODO Auto-generated constructor stub mInflater = LayoutInflater.from(context); this.mList = mList; this.context = context; } public void setFields(String[] fields) { this.fields = fields; } public void setViewIds(int[] viewIds){ this.viewIds = viewIds; } public void setClass(Class<?> e){ this.classOfE = e; } public void setLayoutId(int layoutId) { this.layoutId = layoutId; } @Override public int getCount() { // TODO Auto-generated method stub return mList == null ? 0 : mList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } //获取布局文件,将控件初始化 public Object initViewHolder(View convertView){ try { if (fields.length != viewIds.length) { return null; } Object e = classOfE.newInstance();//调用空构造函数 int length = fields.length; for(int i = 0;i<length;i++){ Field field = classOfE.getDeclaredField(fields[i]);//通过反射获取变量 field.setAccessible(true);//将变量设置为可访问状态 field.set(e,convertView.findViewById(viewIds[i]));//为变量设值 } return e; } catch (InstantiationException ex) { // TODO Auto-generated catch block ex.printStackTrace(); return null; } catch (IllegalAccessException ex) { // TODO Auto-generated catch block ex.printStackTrace(); return null; } catch (IllegalArgumentException ex) { // TODO Auto-generated catch block ex.printStackTrace(); return null; } catch (NoSuchFieldException e1) { // TODO Auto-generated catch block e1.printStackTrace(); return null; } } //抽象方法,实现些方法用于数集的绑定 public abstract void addDataToView(T t,Object o); @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Object e = null; if (convertView == null) { convertView = mInflater.inflate(layoutId, null); e =initViewHolder(convertView); if (e!=null) convertView.setTag(e); } else e = convertView.getTag(); addDataToView(mList.get(position),e); return convertView; }}
这样以后写Adapter的时候,只要继承这个类,并实现addDataToView()
方法就可以.然初始化adapter后,传入相应的布局文件ID,控件ID,变量名和ViewHolder类就可以.如下:
Adapter adapter = new Adapter(this, mList);
adapter.setLayoutId(R.layout.item);
int[] ids = {R.id.name,R.id.age,R.id.sex};
String[] fields = {“name”,”age”,”sex”};
adapter.setClass(MyViewHolder.class);
adapter.setViewIds(ids);
adapter.setFields(fields);
0 0
- 利用Android反射与泛型机制写一个通用的Adapter类
- android 写一个 通用的Adapter
- 利用java反射机制写的一个实体类属性拷贝的工具
- 从配置文件读取数据连接信息,利用泛型和java反射机制,写一个公共的增删改查数据库操作类
- android 一个通用的 适配器 adapter
- 利用反射泛型编写一个通用Dao
- 利用java 反射原理写了一个赋值和取值通用类
- 如何为Recyclerview写一个通用的adapter
- 利用Java的反射机制,写了一个简单的仿Gson的解析器
- 利用java反射机制编写通用的toString 方法
- 利用反射机制解决通用xml的解析
- 利用java的反射机制实现通用dao
- 利用Java反射机制输出一个类的内部构造
- 一个利用java反射机制的例子
- 利用反射泛型编写通用的Dao
- java 反射写的 通用DAO 类
- Android listview 利用反射的自动绑定Adapter
- Java反射结合JDBC写的一个通用DAO
- nginx 源码学习——处理stale event
- session过期监听
- 2D RPG网页游戏《洪荒神话》全套代码下载
- 通达信的系统BOLL-M
- 利用 force index优化sql语句性能
- 利用Android反射与泛型机制写一个通用的Adapter类
- Apple 企业开发者账号&邓白氏码申请记录(含详细过程及时间)
- 如何查看iOS应用crash日志
- java 随机数产生工具类
- Mini-Notes:《操作系统第七版》概念的理解与总结
- 黑马程序员-java1.5自动装箱与拆箱
- JSTL标签 参考手册
- [150706]Linux下在所有文件中查找指定字符串的两种办法
- ORACLE 中ROWNUM用法总结!