问题描述
|
这已在前面的Android ListView IllegalStateException中进行了讨论:“适配器的内容已更改,但ListView尚未收到通知”,但我仍然遇到问题。
我有Service,它可以从Web下载数据,将其保存到db中,并在完成时激发意图。我的活动具有ListView和broadCast接收器:
private class NewsUpdateReceiver extends broadcastReceiver{
@Override
public void onReceive(Context context,Intent intent) {
mnotificationmanager.cancel(NewsService.NOTIFICATION_ID);
loadNewsFromDB();
}
}
private void loadNewsFromDB(){
mList.clear();
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(MeidahonProvider.CONTENT_URI,null,null);
if(cursor.movetoFirst()){
do{
String title = cursor.getString(MeidahonProvider.TITLE_COLUMN);
String description = cursor.getString(MeidahonProvider.DESCRIPTION_COLUMN);
String link = cursor.getString(MeidahonProvider.LINK_COLUMN);
long datems = cursor.getLong(MeidahonProvider.DATE_COLUMN);
Date date=new Date(datems);
NewsItem item = new NewsItem(title,description,link,date);
mList.add(item);
mAdapter.notifyDataSetChanged();
}while(cursor.movetoNext());
}
cursor.close();
}
每次将项目添加到ArrayList时,我都调用mAdapter.notifyDataSetChanged();
,但仍然有异常。我该如何解决这个问题?
UPD日志
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread,but only from the UI thread. [in ListView(2131296334,class android.widget.ListView) with Adapter(class com.transportoid.Tracks.Tracklistadapter)]
at android.widget.ListView.layoutChildren(ListView.java:1432)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2062)
at android.widget.ListView.onTouchEvent(ListView.java:3234)
at android.view.View.dispatchTouchEvent(View.java:3709)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
解决方法
首先,除非您“需要”在每次迭代中使各种有界组件都知道适配器内容的变化,否则我只会在完成所有添加后才调用adapter.notifyDataSetChanged()。
其次,您可以提供Exception和StackTrace吗?
第三,此代码是通过哪个线程(主GUI调度线程或后台)调用的?
感谢Migher提供更新的Logcat。请帮忙澄清一下:您能否运行快速测试以查看当您手动输入相同的数据值时会发生什么...通过菜单选择或按钮单击事件来完成(所以我们会知道的) \位于GUI线程上)?遇到相同的错误?
还值得指出的是尝试一下SimpleCursorAdapter而不是您当前使用的常规适配器。由于我无法通过调试器运行此程序,因此,它可能比来回“异步技术支持”建议来得简单,因为我敢肯定,您希望尽快解决此问题,而不是比以后。
让我知道这两种方法的工作原理-谢谢