利用Android反射与泛型机制写一个通用的Adapter类

原创 2015年07月06日 18:07:35

注意点: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);

Android 泛型使用

百度上copy的泛型基本使用方法 泛型类: public class FanXingLeiDemo {//这里是泛型,可以传任意的参数 private T obj; public T getObj()...

Java泛型应用之打造Android中ListView和GridView万能适配器【CommonAdapter】--超简洁写法

在android中使用最多的就是ListView,GridView,用到这两个控件那么肯定要用到适配器,那就是定义一个类继承BaseAdapter,让后覆写它里面的getCount(),getView...

泛型(包括泛型抽象类的继承)

泛型 泛型 一、什么是泛型? 通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率 二、实例化泛型 1、可以使用任何类型来声明和实例化 2、申明和实例话都必须用一个特定的类型来...
  • zzy7075
  • zzy7075
  • 2012年05月15日 23:08
  • 13232

Android ArrayListAdapter<T>泛型类

/** * ArrayList Adapter泛型类 * Created by lezg on 2014/8/14. */ public abstract class ArrayListAdap...

泛型集合List<T> 的详细用法

List 的详细用法 命名空间:    System.Collections.Generic     List类是 ArrayList 类的泛型等效类。     该类使用大小可 ...
  • jiong12
  • jiong12
  • 2014年09月28日 11:00
  • 16737

从配置文件读取数据连接信息,利用泛型和java反射机制,写一个公共的增删改查数据库操作类

背景: 最近在学习java,然后就看了spring jdbc。对于菜鸟来说,看得实在头大,然而还有强迫症作祟最是要不得。又要导入common的相关jar包,又要导入mysql的jar包,还要导入spr...

利用反射泛型编写一个通用Dao

首先明确几个概念: ArrayList: E为类型参数变量 ArrayList :Integer为实际参数变量 ArrayList: 整个表达式称为参数化类型,对应类型为ParameterizedTy...

通用Adapter设计,SparseArray+泛型+回调的使用

看到题目,我相信聪明的各位已经有一定想法了。 一个Adapter,最简单的优化就是使用泛型,他可以省去非常多的代码,不过在此之上,我们还可以继续优化,优化他的好基友是:ViewHolder。 在过去,...

利用泛型、反射、JPA、Spring技术实现增删改查通用类

1、定义接口 package cn.joeho.base; import java.io.Serializable; public interface DAO {  public String...
  • joeho
  • joeho
  • 2012年06月24日 09:45
  • 2500

android 一个通用的 适配器 adapter

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自【张鸿洋的博客】 1、概述 相信做Andro...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Android反射与泛型机制写一个通用的Adapter类
举报原因:
原因补充:

(最多只允许输入30个字)