【问题标题】:Android ListView/Adapter - IllegalStateException when updating ArrayListAndroid ListView/Adapter - 更新 ArrayList 时出现 IllegalStateException
【发布时间】:2011-04-05 20:06:42
【问题描述】:

首先,我环顾了整个网站,除了“隐藏 ListView”之外,找不到我的问题的解决方案。就我而言,这不是一个可行的解决方案!

那么,问题来了: 我创建了自己的“EndlessAdapter”,它允许我在用户滚动到列表底部时使用更多数据填充支持 ListView 的 ArrayList。这一切都很完美,除了当用户在列表更新时选择行,或者在列表更新时改变方向(我想它可能是任何 UI 交互)。

我已将我的 mAdapter.notifyDatasetChanged() 方法包装在 try catch 中,但我似乎永远无法捕捉到这个 IllegalStateException,所以我不知道它发生在哪里!

有没有办法,在适配器更新 ListView 时,我可以阻止用户与应用程序交互,直到它完成? EndlessAdapter 过程中较长的部分是新数据的下载。更新 ListView 是一个快速的过程。

我真的需要解决这个问题。我宁愿不发布源代码,但如果需要,我可以尝试发布生命体征?否则,如果有这方面经验的人可以通过电子邮件或 IM 聊天,我将非常感激?

这是堆栈跟踪:

04-05 21:11:35.363: ERROR/AndroidRuntime(25707): 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(16908298, class android.widget.ListView) with Adapter(class com.mimminito.heatdroid.view.DealsView$DealAdapter)

这是我的代码示例的链接: http://pastebin.com/wfmWSGwQ

我在 onCreate() 中创建适配器。然后,在解析 XML 后,我将适配器分配给 ListView。在同一个方法中,我调用了 updateList() 方法。这会获取已经下载的数据,然后通知mAdapter它的数据已经改变(全部运行在UI线程上)

感谢您的宝贵时间

亚当

【问题讨论】:

  • 只是一个想法 - 您如何访问 onListItemClicked() 中的数据?我认为您应该通过调用getListView().getItemAtPosition(position) 来访问相关项目以避免并发问题。另外,如果您通过电子邮件或 IM 发现了解决方案,您是否会在此处发布,以便其他人参考?
  • 另外,如果不是代码,发布堆栈跟踪可能会有所帮助。

标签: android exception listview arraylist illegalstateexception


【解决方案1】:

您正在按照它所说的那样在 UI 线程中添加到列表和通知?这是保证 UI 和您的其他线程不会同时使用该列表的唯一方法。

【讨论】:

  • 是的,我确保这正在发生。我会尝试删掉我的私人代码,然后添加准系统,这样你就可以看到我的流程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多