利用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);

Java泛型类的继承关系

引言类型兼容的对象可以进行赋值,如可将一个 Integer 对象传给一个 Object 对象,因为 Object 是 Integer 的基类。Object someObject = new Objec...
  • bigconvience
  • bigconvience
  • 2016年03月03日 11:18
  • 6445

Android开发技巧——BaseAdapter的另一种优雅封装

RecyclerView虽然因其灵活性、高效性等特点而备受好评,但也不是一定得用它把ListView给替代掉。在某些场景中,ListView还是相对更适合的。比如数据量不大,不频繁更新,并且需要简单地...
  • maosidiaoxian
  • maosidiaoxian
  • 2016年12月03日 14:20
  • 2387

Android之自定义实现BaseAdapter(通用适配器四)

Android之自定义实现BaseAdapter(通用适配器四)最近又学习到了一种自定义通用适配器的方法,刚好可以结合前面的一起来写一下,接下来先看代码吧。CommonAdapter.javapubl...
  • qq_27630169
  • qq_27630169
  • 2016年09月08日 19:52
  • 910

笔记:动态改变数组-泛型类ArrayList<T>

Java中可以用泛型类数组ArrayList类解决程序在运行时数组大小改变的问题,在添加或删除元素时,可以自动调节数组容器的大小。指定存放对象的类型,需要将类型标注在尖括号内,并添加在ArrayLis...
  • ly417631931
  • ly417631931
  • 2016年03月04日 17:12
  • 684

java泛型详解和反射泛型通用BaseDao实现

一 泛型的基本概念 1.1什么是泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型...
  • nwpu_geeker
  • nwpu_geeker
  • 2017年12月05日 21:54
  • 197

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

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

Java 利用反射、泛型实现dao层的增删改查

Java利用反射实现dao层数据的增删改查,其中删除和修改没有必要使用反射,这里实现了增加、有条件的查询单个对象,有条件的查询对象集合。 实体层:package com.bh.beans;import...
  • cuiyaoqiang
  • cuiyaoqiang
  • 2016年02月26日 17:42
  • 2575

java中利用反射编写通用servlet

利用反射来建立通用的servlet,提高代码的重用性,从而降低项目中servlet的个数。...
  • haofeijina
  • haofeijina
  • 2016年09月27日 22:05
  • 1220

使用Java泛型和反射机制编写Excel文件生成和解析的通用工具类

前几天被派到一个小项目中做临时维护,工作地点不方便且不说,项目代码那叫一个恶心... 代码几乎完全没有注释。这应该是我们天朝大部分程序员的习惯,代码不写注释,给后面维护的同事带来多大麻烦啊!...
  • zhangyihui1986
  • zhangyihui1986
  • 2013年01月17日 13:21
  • 1761

【Java学习】使用泛型和反射 创建通用的数据库查询方法

开始接触数据库编程的时候可能会觉得,不同的数据库表的查询应该对应不同的查询方法,但是这样会非常耗时并且没有意义,这里可以通过反射和泛型来创建一个通用的数据库查询方法。当查询不同的表时,只需要改变查询方...
  • qq_23419401
  • qq_23419401
  • 2016年08月29日 23:16
  • 1393
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Android反射与泛型机制写一个通用的Adapter类
举报原因:
原因补充:

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