【问题标题】:CursorAdapter and OnItemClickListener for ListView Related QuestionsListView 相关问题的 CursorAdapter 和 OnItemClickListener
【发布时间】:2011-11-04 11:00:46
【问题描述】:

我想问两个与OnItemClickListener 的行为有关的问题,当我为我的listivew 使用光标适配器时。更具体地说:

我已经覆盖了游标适配器的getCount() 以添加日志(以便检查何时调用它)。我注意到,当我单击列表中的一个项目时,我看到 getCount() 已执行了两次。我真的不明白为什么会这样。下面是被覆盖的getCount()mCursor 是我的适配器的光标对象。

   @Override
public int getCount() {
    if (mCursor != null) {
        int total = mCursor.getCount();
        Log.d(TAG, "Count of cursor is: " + total);
        return total;
    } else
        Log.e(TAG, "Count of cursor is: " + 0);
    return 0;
}

其次,我想从这个监听器开始另一个活动。当我点击一个项目时,我得到以下异常:

08-26 14:15:20.487:DEBUG/AgendaAdapter(14110):游标计数为:14

08-26 14:15:20.525:DEBUG/AgendaAdapter(14110):游标计数为:14

08-26 14:15:20.535:DEBUG/AgendaActivity(14110):位置是:2

08-26 14:15:20.535:DEBUG/AgendaActivity(14110):ID 为:353

08-26 14:15:20.535:INFO/ActivityManager(104):开始活动:Intent {AgendaEventActivity(有额外内容)}

08-26 14:15:20.575:调试/议程活动(14110):onPause

08-26 14:15:20.865:INFO/ActivityManager(104):显示的活动 AgendaEventActivity:287 毫秒(总共 287 毫秒)

08-26 14:15:20.875:DEBUG/AgendaAdapter(14110):游标计数为:14

08-26 14:15:20.875:DEBUG/AgendaAdapter(14110):游标计数为:14

08-26 14:15:20.885:DEBUG/AgendaAdapter(14110):游标计数为:14

08-26 14:15:20.885:DEBUG/AgendaAdapter(14110):游标计数为:14

08-26 14:15:20.885:调试/AndroidRuntime(14110):关闭 VM

08-26 14:15:20.885: WARN/dalvikvm(14110): threadid=1: 线程以未捕获的异常退出 (group=0x40028a00) 08-26 14:15:20.905:错误/AndroidRuntime(14110):致命异常:主要 08-26 14:15:20.905: ERROR/AndroidRuntime(14110): java.lang.IllegalStateException: 这应该只在光标有效时调用

所以,当我单击一个项目时,getCount() 被执行,然后从 onItemClickListener 跟踪两个日志以及被单击项目的 posid,然后再次调用 getCount()。 . 最后,当前的活动被暂停,我开始的新活动得到这个IllegalStateException,我不明白为什么..

对于游标,我在启动时使用了 managedquery()..

任何帮助将不胜感激!感谢您的宝贵时间!

异常的堆栈跟踪是:

08-26 14:35:17.735:错误/AndroidRuntime(24173):致命异常:主要

08-26 14:35:17.735: ERROR/AndroidRuntime(24173): java.lang.IllegalStateException: 这应该只在游标有效时调用 08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.CursorAdapter.getView(CursorAdapter.java:175)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.AbsListView.obtainView(AbsListView.java:1294)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.ListView.makeAndAddView(ListView.java:1727)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.ListView.fillSpecific(ListView.java:1272)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.ListView.layoutChildren(ListView.java:1591)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.AbsListView.onLayout(AbsListView.java:1147)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1042)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:909)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.FrameLayout.onLayout(FrameLayout.java:333)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.widget.FrameLayout.onLayout(FrameLayout.java:333)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.735:错误/AndroidRuntime(24173):在 android.view.ViewRoot.performTraversals(ViewRoot.java:1049)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1744)

08-26 14:35:17.735:错误/AndroidRuntime(24173):在 android.os.Handler.dispatchMessage(Handler.java:99)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.os.Looper.loop(Looper.java:143)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): 在 android.app.ActivityThread.main(ActivityThread.java:4914)

08-26 14:35:17.735: ERROR/AndroidRuntime(24173): at java.lang.reflect.Method.invokeNative(Native Method)

08-26 14:35:17.735: 错误/AndroidRuntime(24173): at java.lang.reflect.Method.invoke(Method.java:521)

08-26 14:35:17.735: ERROR/AndroidRuntime(24173): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

08-26 14:35:17.735: ERROR/AndroidRuntime(24173): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

08-26 14:35:17.735: ERROR/AndroidRuntime(24173): at dalvik.system.NativeStart.main(Native Method)

这是来自 getCount() 的 dumpStack:

08-26 14:35:17.615: WARN/System.err(24173): java.lang.Throwable: 堆栈转储

08-26 14:35:17.695: DEBUG/dalvikvm(24173): GC_FOR_MALLOC 在 78 毫秒内释放了 19264 个对象 / 1052704 个字节

08-26 14:35:17.695: WARN/System.err(24173): at java.lang.Thread.dumpStack(Thread.java:618)

08-26 14:35:17.705:WARN/System.err(24173):在 AgendaAdapter.getCount(AgendaAdapter.java:31)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.widget.ListView.layoutChildren(ListView.java:1491)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.widget.AbsListView.onLayout(AbsListView.java:1147)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1042)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:909)

08-26 14:35:17.705: WARN/System.err(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.715: WARN/System.err(24173): 在 android.widget.FrameLayout.onLayout(FrameLayout.java:333)

08-26 14:35:17.715: WARN/System.err(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.715: WARN/System.err(24173): 在 android.widget.FrameLayout.onLayout(FrameLayout.java:333)

08-26 14:35:17.715: WARN/System.err(24173): 在 android.view.View.layout(View.java:7034)

08-26 14:35:17.715:WARN/System.err(24173):在 android.view.ViewRoot.performTraversals(ViewRoot.java:1049)

08-26 14:35:17.715:WARN/System.err(24173):在 android.view.ViewRoot.handleMessage(ViewRoot.java:1744)

08-26 14:35:17.715:WARN/System.err(24173):在 android.os.Handler.dispatchMessage(Handler.java:99)

08-26 14:35:17.715: WARN/System.err(24173): 在 android.os.Looper.loop(Looper.java:143)

08-26 14:35:17.715: WARN/System.err(24173): 在 android.app.ActivityThread.main(ActivityThread.java:4914)

08-26 14:35:17.715: WARN/System.err(24173): at java.lang.reflect.Method.invokeNative(Native Method)

08-26 14:35:17.715: WARN/System.err(24173): at java.lang.reflect.Method.invoke(Method.java:521)

08-26 14:35:17.715: WARN/System.err(24173): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

08-26 14:35:17.715: WARN/System.err(24173): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

08-26 14:35:17.715: WARN/System.err(24173): at dalvik.system.NativeStart.main(Native Method)

所以是从ListView调用的,但是在activity的onPause()之后怎么调用呢?

【问题讨论】:

  • 最后,我找到了一个解决方案(不完全理解为什么以前的方法不起作用..)。我现在使用 query() 并在 onDestroy() 处关闭游标,而不是 managedQuery()。因此,我认为 managedQuery 管理游标生命周期的方式在活动暂停时存在问题(???)。

标签: android android-listview android-contentprovider onitemclicklistener android-cursor


【解决方案1】:

您可以尝试在您的 getCount() 方法中调用 Thread.dumpStack() 以查看调用它的内容。

你能发布来自 IllegalStateException 的堆栈跟踪吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多