我启动ListView,启动一个Thread并加载数据......然后ListView不会更新!
有几个人告诉我应该使用notifyDataSetChanged()
。
但是我不能把这个命令放在我的线程中(只是未知)。
有什么想法吗?
答案 0 :(得分:19)
我有同样的问题......当我遇到这个问题时,我很兴奋。但没有答案? : - (
之后,让问题持续了大约两周,我找到了solution here:
长话短说:
从上面链接引用:
我们必须使用Handler对象,因为 我们无法更新大多数UI对象 在一个单独的线程中。当我们发送一个 消息给它将得到的处理程序 保存到队列中并由执行 尽快使用UI线程。
查看代码后,您会看到作者所说的内容 注意:即使使用处理程序,Android也可能不允许您从线程的run()方法更新视图对象。 我收到了这个错误:
05-31 02:12:17.064: ERROR/AndroidRuntime(881):
android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
为了解决这个问题,我在run()方法中更新了一个数据数组,并使用该数组更新了处理程序的handleMessage()方法中的视图。
我希望这可以帮助其他人。
答案 1 :(得分:4)
您可以使用slowAdapter刷新视图:
SlowAdapter = new SlowAdapter(this);
list.setAdapter(SlowAdapter);
SlowAdapter.notifyDataSetChanged();
答案 2 :(得分:3)
在阅读这个帖子并尝试时,我自己就找到了它。
简短: AsyncTask 的方法 onProgressUpdate 可以触摸视图:http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate(Progress...)
背景:我需要在游标上调用requery,以便在任务填充数据库时不断更新ListView。在 doInBackground 中进行的重新查询调用因提及的 CalledFromWrongThreadException 失败,但 onProgressUpdate 中的相同代码无效。