自定义列表光标适配器在模拟器上的bindView上崩溃 - 而不是在手机上崩溃

时间:2010-08-23 12:18:43

标签: android cursor adapter listadapter

如果可以的话,我会尽量具体 - 请耐心等待,第一次询问并且在此平台上编程相对较新。如果之前有人问过/已经回答过道歉 - 请将它链接给我。我上下搜索但发现其他无关(至少对我来说)问题。

对我来说真正的益智游戏是我的应用程序在我的模拟器上崩溃但是当我的手机上安装时(通过将apk上传到手机然后使用市场上的AppInstaller应用程序)它可以正常工作。

崩溃来自自定义列表游标适配器的以下代码段(我的代码)中的编号行的NullPointerException。

// TaskListCursorAdapter.java

@Override
public void bindView(View view, Context context, Cursor cursor) {

    super.bindView(view, context, cursor); // <<< LINE 36
    // DO OTHER BINDING OF STRINGS TO TEXT VIEWS ETC

创建了以下错误转储。

08-23 21:58:57.251: ERROR/AndroidRuntime(346): Uncaught handler: thread main exiting due to uncaught exception
08-23 21:58:57.411: ERROR/AndroidRuntime(346): java.lang.NullPointerException
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:149)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at adriaansapps.com.tasks.TaskListCursorAdapter.bindView(TaskListCursorAdapter.java:36)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at adriaansapps.com.tasks.TaskListCursorAdapter.newView(TaskListCursorAdapter.java:83)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.CursorAdapter.getView(CursorAdapter.java:182)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.AbsListView.obtainView(AbsListView.java:1274)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1147)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.ListView.onMeasure(ListView.java:1060)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.View.measure(View.java:7964)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:619)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:280)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.View.measure(View.java:7964)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:569)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:361)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.View.measure(View.java:7964)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.View.measure(View.java:7964)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.View.measure(View.java:7964)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.View.measure(View.java:7964)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.ViewRoot.performTraversals(ViewRoot.java:763)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.os.Looper.loop(Looper.java:123)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at java.lang.reflect.Method.invokeNative(Native Method)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at java.lang.reflect.Method.invoke(Method.java:521)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at dalvik.system.NativeStart.main(Native Method)

奇怪的是,我一直很乐意整天编程和调试,而且我的应用程序的长时间工作和无bug部分现在抛出了这个错误。

我怀疑它可能是数据库的一个问题,但实际上并不确定 - 那里似乎没有什么不合适的地方。直到今天我有一个只有一个表的数据库 - 今天我添加了一个新表,其中还有一个“_id”字段作为名称autoincrement key字段,我在docs中读取的是android列表适配器所需的(如果内存服务) 。在编码方面有一些经验,在数据库方面有一些小经验,这对我来说似乎不是一个好主意,但我不确定这是否是问题和/或如何做到这一点。

我在此列出的崩溃不显示或引用另一个新表中的数据。游标不包含任何查询数据。事实上,如果我将新表的关键字段“_id”重命名为其他内容(即“_blah”),则崩溃仍然存在。

就像我说的,如果我将apk上传到我的手机,它就可以了。

我在模拟器上尝试了以下内容: - 重启adb(和eclipse) - 没有结果 - 从模拟器卸载 - 没有结果 - destory AVD配置文件并重新创建 - 无结果

我是在Android 2.1 SDK下开发的,并且已经持续了几周。我只安装了SDK,我还没有更新到2.2。

不确定我在这里还能说些什么 - 希望这里的人有足够的经验来阐明它。

如果没有解决这个问题,我可以预期一个非常缓慢的开发过程(假设我必须上传到我的手机来测试新的代码更改......)。

很抱歉长篇大论 - 希望我能为你们中的一个聪明人提供足够的信息来解决这个问题。感谢

4 个答案:

答案 0 :(得分:1)

我认为你不应该直接调用.bindView()来形成源代码。看起来你这样看着你的错误转储:

08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at adriaansapps.com.tasks.TaskListCursorAdapter.bindView(TaskListCursorAdapter.java:36)
08-23 21:58:57.411: ERROR/AndroidRuntime(346):     at adriaansapps.com.tasks.TaskListCursorAdapter.newView(TaskListCursorAdapter.java:83)

只需使用ListView.setAdapter(...)设置ListView / GridView的适配器,让神奇的事情发生。

答案 1 :(得分:1)

您的问题是您没有覆盖getViewTypeCount和getViewType方法。如果你没有覆盖这些方法,有时Android会用不正确类型的“convertView”参数调用你的getView,如果你把这个参数传递给适配器的getView,你会在尝试重用该对象时得到NullPointerException。 p>

为什么它可以在手机中使用?我不确定,也许手机中的SimpleCursorAdapter版本会检查您传递的“convertView”参数的类型是否正确。我发现了一个崩溃2.1仿真器的情况,但不是1.5,1.6,2.2或我的手机。

如果您想尝试更简单的方法来解决问题(但不太理想),您始终可以将“convertView”参数作为“null”传递给SimpleCursorAdapter。这样SimpleCursorAdapter永远不会重用任何View,但它适用于所有地方(模拟器所有版本+手机)。

您可以查看Jeff Sharkey的本教程

Separating Lists with Headers in Android 0.9

答案 2 :(得分:0)

看看logcat日志稍微高一点。您可能会发现存在SQL错误(通常为黄色),并且可能会说明模糊列名称。您可能需要添加表的名称,后跟一个句点以获取_id列。

由于这个问题我昨天遇到了这个问题。

为什么手机上可能没有这种情况可能是因为您可能没有在手机上正确创建新表格。尝试清除数据(使用管理应用程序)并再次运行应用程序。

我95%肯定你的问题是不明确的列名,你会发现它在logcat中比你发布的错误高一点,可能比上面的3行。

答案 3 :(得分:0)

查看Android 2.2源代码,我看到SimpleCursorAdapter的{​​{1}}可能引发bindView()的唯一方法是,如果您提供给构造函数的NullPointerException数组是to或者您提供给构造函数的nullCursor

现在,null肯定会在2.1和2.2之间发生一些变化,因为2.2版本的第149行不在SimpleCursorAdapter中。因此,2.1中的bindView()可能还有其他可能的情况,我在2.2中没有看到。