ListView中添加headerView
在ListView中可以通过addHeaderView()来添加一个View,固定显示在ListView所有item的前面。
但如果此方法调用不当,就可能会产生异常。
例如如下这段代码
UserAdapter adapter = new UserAdapter();
listView.setAdapter(adapter);
View headerView = View.inflate(this, R.layout.list_header, null);
listView.addHeaderView(headerView);
在运行时可能会抛出如下异常。
java.lang.IllegalStateException: Cannot add header view to list – setAdapter has already been called.
问题分析
从异常信息上就可以很容易知道异常的原因,也就是不能再setAdapter()之后再添加header view。
此问题是ListView中的一个设计缺陷,只在Android4.4以下版本中出现,以下是Android4.4和Android4.0版本ListView部分源码的比较。
可以看到在android4.0版本中,addHeaderView()一开始就会判断是否已经设置了adapter,如果已经设置了adapter且当前adapter不是HeaderViewListAdapter,则会抛出此异常。而在android4.4版本中去掉了这个判断,注意两个版本注释部分的变化。
此外,在android2.3版本中,addHeaderView()判断条件和android4.0版本又有所不同,在android2.3版本中只判断是否已