listView.getChildAt(i)时java.lang.NullPointerException

本文解析了使用ListView和BaseAdapter时常见的误区,指出通过listView.getChildAt(i)仅能获取当前屏幕可见组件,并提供了正确的实现方式,即利用OnItemClickListener来响应用户点击事件。

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

       BaseAdapter返回的是当前屏幕所能显示Item条数的组件,所以通过listView.getChildAt(i);

返回的是当前屏幕所能显示的组件,不能通过listView.getChildAt(i)方法获取除当前屏幕所能显示组件以外的其它组件。所以下面的方法是错误的:

for (int i = 0; i < listView.getCount(); i++)
{
         CheckBox checkBox = (CheckBox)listView.getChildAt(i); //试图通过此方法返回ListView所有的Item中的组件,但是是错误的。
}

上面的做法会出现如下异常:


查看源代码可知:


此时通过listView.getChildAt(i);获得的对象应该是null,null对象是没有属性和方法的所以会出现空指针异常。

正确做法:

list.setOnItemClickListener(new OnItemClickListener() {
                            @Override
                            public voidonItemClick(AdapterView<?> parent, View view,
                                               int position, longid) {
                                     // TODO Auto-generated method stub
                                     CheckBoxcheckBox=(CheckBox) view.findViewById(R.id.cbSelect);
                                     checkBox.toggle();                                       
                                     if ( checkBox.isChecked()) {
                                               // 添加该列表项的电话号码
                                               sendList.add(numList.get(position));
                                               sendName.add(nameList.get(position));        
                                     }else {
                                               //从群发列表中移除电话号及姓名
                                               sendList.remove(numList.get(position));
                                               sendName.remove(nameList.get(position));
                                     }
                            }
                   });


同样是为了获得用于所选择的Item,这个方法则选择了当用户单击了某个Item时通过回调OnItemClickListener,获取单击的Item中的组件(也就是适配器public View getView(int position, View convertView,ViewGroupparent)所返回的组件),通过此组件找到它的子组件。然后对子组件进行相应的操作。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值