通常我们写一个继承BaseAdapter的自定义适配器的时候,主要想做的大概有两件事:

1、在适配的组件里(如ListView,GridView)定义自己想要的布局(Layout)。

2、为布局里的组件(如Button)添加触发响应的事件(如Click)。

当我们写自定义Adapter的时候需要override以下几个方法

@Overridepublic int getCount() {return 0;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {   return null;}

这里我们需要了解getView方法不是在页面生成的时候只被调用一次,而是根据你当前页面能显示的List里的条目数,被调用数次。什么意思呢?说白了,我们生成的这个自定义的页面(通常是放在ListView里的)看起来好像是一个整体,实际上是由许多个convertView拼装成的,每个convertView就相当于一个Item,然后这些Item被塞到ListView中去,理解不了,可以看下图:

wKioL1OC-J7x3_LlAAESkvIL9xA589.jpg

这是一个activity的layout布局。

wKioL1OC-J_TtYIuAACW4bJSFj0215.jpg

这是一个Item的layout布局。

convertView里我们就可以随意的加些小组件,比如按钮啊,然后为按钮添加一些事件什么的。

getView里的具体实现我就不缀述了,我想强调的是返回值,一定要return最新生成的convertView,否则功亏一篑。这里我栽过小2次。正确的就是这样:

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {     //这里就是给获取组件,进行一些赋值操作或者添加事件     return convertView;}

然后,这里还有另外一个坑,就是getCount方法。默认情况下就如同上面写的一样,看似好像可以不用管它,直接return 0;就好,不过经过我这个试坑专员的验证,不管它是绝对不行的。当我们用 listview去setAdapter的时候,程序先走的是你自定义Adapter的构造函数,然后就会走getCount方法,之后才会进入getView方法,如果getCount返回0了,那么后面的事情就不用多想了,不会调用。这个坑我记得是把我整的挺惨,希望大家别掉下去。