使用ListView的addFooterView或者addHeaderView报错或者不知名的异常:at android.widget.ListView.clearRecycledState(List

问题:

Caused by: java.lang.NullPointerException

    at android.widget.ListView.clearRecycledState(ListView.java:522)

    at android.widget.ListView.resetList(ListView.java:508)

    at android.widget.ListView.setAdapter(ListView.java:440)

    at com.company.myapp.MyActivity.refreshList(MyActivity.java:85)

    at com.company.myapp.MyActivity.onCreate(MyActivity.java:37)

    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)

    ... 11 mored

如上:

当发生这种状况。。。。,eclipse得到的异常就在你listView.setAdapter(adapter);这句话中。。。你怎么看listView和adapter都没有空值,正纳闷时
你应该要考虑一下被你添加的FooterView或者HeaderView是否为null,因为空的话。。。ListView就无法测量高度。。。然后无法布局。。最后就报错了。。。还有addFooterView和addHeaderView这两个方法一定要放在
listView.setAdapter(adapter);前面,要不然死活都不会出现你想要的FooterView或者HeaderView;

解决办法:

1. 分析这一行代码listView.setAdapter(adapter);

debug  查看listView 和adpter  两个变量是不是为空;(一般不会为null);

2.因为是添加这句代码后才会出现空指针的错误,所以查看datalist.addHeaderView(header)中的参数header是不是null  ;

经debug 后,发现header 是null,这样错误的位置就定下来的;

3.再继续向上查看View header = findViewById(R.layout.headertitle);

其实上面的代码是错误的:因为R.layout下的常量,并不能用来作为findViewById的参数。如果你需要找到一个view,那么你首先要给它定义一个id,然后用R.id下的常量来进行访问。

4.然后我们给view 定义一个id,将代码修改为View header = findViewById(R.id.headertitle);

还是报nullpointer;

5.到这里我们就得做进一步调查,到底怎么加载header???

findViewById返回Null 该如何处理?

网上搜了下,拾人牙慧,总结原因,一般为3种:

1.在另一个view的元素应该用baseView.findViewById()来拿

findViewById()是要指定view的,如果在该view下找不到,自然报null。平时注意养成写view.findViewById()的习惯就不容易错了。

 

2.findViewById在setContentView(R.layout.main);之前.

即在setContentView调用之前,调用了findViewById去找main布局中的界面元素lv_contactbook,那么所得到的lv一定是null。正确的做法是将上面代码中加粗的哪一行,挪至setContentView方法调用之后即可。


3.clean一下工程,让ID重新生成

这种情况是调用LayoutInflater.inflate将布局xml规定的内容转化为相应的对象。比如有rowview.xml布局文件(比如在自定义Adapter的时候,用作ListView中的一行的内容的布局),假定在自定的Adapter的getView方法中有类似如下的代码:
View rowview = (View)inflater.inflate(R.layout.rowview, parent,false);
TextView tv_contact_id=(TextView)rowview.findViewById(R.id.tv_contact_id);
TextView tv_contactname=(TextView)rowview.findViewById(R.id.tv_contactname);

有时候居然也会发现rowview非空,但tv_contact_id和tv_contactname都是null!仔细看代码,怎么也看不出错误来。到底是什么原因造成的呢?答案是Eclipse造成的,要解决这个问题,需要这个项目clean一次(Project菜单-> Clean子菜单),这样就OK了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值