通常我们写一个继承BaseAdapter的自定义适配器的时候,主要想做的大概有两件事:
1、在适配的组件里(如ListView,GridView)定义自己想要的布局(Layout)。
2、为布局里的组件(如Button)添加触发响应的事件(如Click)。
当我们写自定义Adapter的时候需要override以下几个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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中去,理解不了,可以看下图:
这是一个activity的layout布局。
这是一个Item的layout布局。
convertView里我们就可以随意的加些小组件,比如按钮啊,然后为按钮添加一些事件什么的。
getView里的具体实现我就不缀述了,我想强调的是返回值,一定要return最新生成的convertView,否则功亏一篑。这里我栽过小2次。正确的就是这样:
1
2
3
4
|
@Overridepublic
View getView(
int
position, View convertView, ViewGroup parent) {
//这里就是给获取组件,进行一些赋值操作或者添加事件
return
convertView;
}
|
然后,这里还有另外一个坑,就是getCount方法。默认情况下就如同上面写的一样,看似好像可以不用管它,直接return 0;就好,不过经过我这个试坑专员的验证,不管它是绝对不行的。当我们用 listview去setAdapter的时候,程序先走的是你自定义Adapter的构造函数,然后就会走getCount方法,之后才会进入getView方法,如果getCount返回0了,那么后面的事情就不用多想了,不会调用。这个坑我记得是把我整的挺惨,希望大家别掉下去。