使用ListView时的注意事项有哪些

来源:互联网 发布:sql查询多表相同列名 编辑:程序博客网 时间:2024/09/21 09:00

以下是从平时工作中总结出来的,不知道这些”小坑”,你遇到过没有:
一、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布局里的高度属性才有效。