以下是从平时工作中总结出来的,不知道这些”小坑”,你遇到过没有:
一、setAdapter与addHeaderView语句的调用顺序有啥要求吗?
答:有要求。要求先addHeaderView然后才能setAdapter。否则在sdk 4.2版本的机器上就会崩掉。出现如下错误:
java.lang.IllegalStateException:Cannot add header view to list -- setAdapter has already been called.
原因可参见:从源码上分析ListView的addHeaderView和setAdapter的调用顺序
二、关于setOnItemClickListener的使用。在回调函数:
onItemClick里,获得ItemData的正确姿势是:
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object itemData = parent.getAdapter().getItem(position);
if (itemData instanceof XXXItemBean) {
......
}
}
});
而不要直接使用Item的数据源数组。因为在listview存在Header或Footer的情况下,回调接口里的position是包含了header和footer的,并不只是item的数据。
三、当迫不得已需要在scrollView里面嵌套listView时,为了使得ListView能适应父节点scrollView的高度,你需要自定义一个CustomListView继承自ListView,然后重写onMeasure方法,具体写法如下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
四、在getView方法里inflate每个Item时,inflate方法的正确的用法是:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.xxx, parent, false);
}
……
}
这样调用,你的Item布局里的高度属性才有效。