做过Android的同学应该都有适配安卓兼容性的问题,今天我们来说一个常见却又经常被忽略的问题。
可能很多同学有被ListView坑过的经验,好端端的代码只有在4.0机型上才有奇怪的崩溃问题。 做app开发的应该都知道,ListView在4.0及以前的系统上,必须现在 setAdapter 之前 addHeaderView,否则会导致崩,而这问题在4.4之后就不存在了。
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 之前调用 addHeaderView
我们可以看看4.0的addHeaderView的代码
public void addHeaderView(View v, Object data, boolean isSelectable) {
if (mAdapter != null && !(mAdapter instanceof HeaderViewListAdapter)) {
throw new IllegalStateException("...")
而4.4及以后的代码则变成了
public void addHeaderView(View v, Object data, boolean isSelectable) {
....
// Wrap the adapter if it wasn't already wrapped.
if (mAdapter != null) {
if (!(mAdapter instanceof HeaderViewListAdapter)) {
wrapHeaderListAdapterInternal();
以后在面试时如果被问到,就知道什么原因啦! 不过还是建议不要用ListView,毕竟它在复杂场景下的扩展性相当弱鸡..能用RecyclerView代替的话推荐RecyclerView。