1.ListView 不能在setAdapter之后addHeadView
说明
java.lang.IllegalStateException: Cannot add header view to list – setAdapter has already been called
1.必须在setAdapter之前执行addHeaderView方法
2.xml中有entries属性的话,adapter会自动调用,在android4.3之前的系统即使在setAdapter之前调用addHeaderView也会报错
If you were used android:entries in ListView in xml file, Its called setAdapter() method before addHeaderView. So remove android:entriesattribute from ListView in xml layout file. It will be work.
看到这里,首先想到的是在addHeaderView之前不要设置adapter,但是实际项目是listView的数据源来回切换的,所以不可能保证adapter一直在addHeaderView 之前,这样,只好在addHeaderView之前清空Adapter;
实际项目中又发现如果这样的话,addHeaderView的内容是显示不出来的,反复调试发现需要在这之后,再将adapter设置上去,才能得到想要的结果,代码如下:
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
// 4.3 之前的版本 listView不能在set adapter之后add header
int limitApiVersion = android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
private <T extends ListAdapter>void oldVersionHandle(View header,T mAdapter) {
// 解决低版本add header 时报错的问题,设置adapter为null
if (currentApiVersion < limitApiVersion && lvMomentsJudge.getAdapter() != null) {
DU.s('a', "set adapter null");
lvMomentsJudge.setAdapter(null);
}
lvMomentsJudge.addHeaderView(header, null, false);
assert mAdapter != null;
// 必须在add header view 之后再把之前设为null的adapter加上,否则会出现不显示的结果
lvMomentsJudge.setAdapter(mAdapter);
}
转载署源:
By-KyleCe
Link:http://blog.youkuaiyun.com/KyleCeshen/article/details/49869481