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

本文总结了Android开发中ListView组件的实用技巧,包括setAdapter与addHeaderView的调用顺序、setOnItemClickListener的正确使用方法、scrollView内嵌listView时如何自定义ListView使其适应高度以及getView方法中inflate的正确姿势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值