当项目开发的时候,会涉及到listview数据的本地数据库缓存,比如
for (int i = 0; i < responseData.getNotice_list().size(); i++) {
GetNoticeListResponseData bean = responseData.getNotice_list().get(i);
bean.setId(responseData.getNotice_list().get(i).getId());
bean.setContent(responseData.getNotice_list().get(i).getContent());
bean.setCreated_at(responseData.getNotice_list().get(i).getCreated_at());
bean.setUsername(responseData.getNotice_list().get(i).getUrl_info().get(0).getUsername());
bean.setSubject(responseData.getNotice_list().get(i).getUrl_info().get(0).getSubject());
// <span style="color:#ff0000;">dao.createOrUpdate(bean);</span>
noticeListData.add(bean);
}
如上红色部分如果不注释掉,程序执行就是一边数据库缓存数据,一边adapter的数据源noticeListData再改变数据,然后一直到for循环结束
程序执行插入数据库是个耗时操作,adapter的数据源数据更改后没能得到及时的notifyDataSetChanged(),所以会报错java.lang.IllegalStateException,这种错误甚至乎不会告诉你你的代码的哪行,如果没想到一般很难发现这里的错误。
http://gundumw100.iteye.com/blog/1738829
我改变了数据集,比如我把数据全清空了userBooks.clear(),这个时候我没有及时调用adapter.notifyDataSetChanged(),会导致ListView没有数据而抛java.lang.IllegalStateException这个异常。
记住,当改变了数据集之后,需要及时adapter.notifyDataSetChanged()也就是说,这2句话需要写在一起:
- userBooks.clear();
- if(adapter!=null){
- adapter.notifyDataSetChanged();
- }