9 java layout user-interface android listview
在我的应用程序中,有时抛出以下异常:
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):
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(2131099717, class android.widget.ListView) with
Adapter(class ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter)]
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.ListView.layoutChildren(ListView.java:1432)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.AbsListView.onLayout(AbsListView.java:1113)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1108)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:920)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.ViewRoot.performTraversals(ViewRoot.java:996)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.os.Handler.dispatchMessage(Handler.java:99)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.os.Looper.loop(Looper.java:123)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.app.ActivityThread.main(ActivityThread.java:4338)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
java.lang.reflect.Method.invokeNative(Native Method)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
java.lang.reflect.Method.invoke(Method.java:521)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
很难找到错误,因为在堆栈跟踪中没有列出任何方法.那么,有没有人知道什么时候抛出这个异常?谢谢你的任何提示.
Ham*_*amy 22
它确实告诉你发生错误的类:ch.uzh.csg.games4blue.gamebase.view.UserView
包含一个在其中调用的类UserAdapter
.
让我试着解释一下这里发生-当你创建一个ListView
与Adapter
在备份时,ListView
通过询问适配器它得到它的数据.每次滚动时,ListView都会向适配器询问您滚动到的新项目.
通常你创建ListView,你创建适配器,你在listview上设置适配器,你就完成了.Android OS负责其余部分.但是,您尝试做的事情有点复杂.您试图偶尔更新适配器中的数据.您可以想象,如果适配器数据发生变化,则需要通知列表视图,对吧?如果您正在显示包含2个项目的列表,并且您突然向适配器添加了2个项目,那么该列表现在应该显示4个项目!但是,如果listview必须不断检查适配器是否已更改,那么效率会非常低,对吧?所以需要发生的是listview将假定适配器不会更改,并且适配器将通知listview它是否确实更改.
但是,您未能做的是通知列表视图适配器内的数据发生了变化.在UserAdapter或UserView内的某处,数据正在被更改!为了方便每个人,也许您可以发布完整的UserView类?我敢打赌,你有一些数据对象,如ArrayList,作为UserView类中的私有变量.在UserAdapter类中,您将此数据提供给ListView.但是,在您已将其提供给ListView 之后,您正在修改此数据集的UserView类中的某个位置.
免责声明:我主要是在这里复制其他答案,但我认为如果我将2-3个答案结合起来,我可以更清楚地了解正在发生的事情.
免责声明2:我很累,这写得很糟糕.把它变成一个维基,希望有人清理我深夜的烂摊子.如果这是完全无法理解的,那么就这么说并且删除它
您可以在堆栈跟踪中看到错误:
适配器的内容发生了变化,但ListView没有收到通知。确保适配器的内容不是从后台线程修改的,而是仅从 UI 线程修改的。
您应该查看您的线程之一并使其与您的 UI 线程同步。
在 Android 中执行此操作的方法是使用 Handler。
http://developer.android.com/guide/appendix/faq/commontasks.html#threading