CursorAdapter и OnItemClickListener для связанных вопросов ListView

Я хотел бы задать два вопроса, связанных с поведением 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): идентификатор: 353

08-26 14:15:20.535: INFO/ActivityManager(104): Запуск активности: Intent {AgendaEventActivity (есть дополнительные функции)}

08-26 14:15:20.575: DEBUG/AgendaActivity(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: DEBUG/AndroidRuntime(14110): завершение работы виртуальной машины

08-26 14:15:20.885: WARN/dalvikvm(14110): threadid=1: поток завершается с необработанным исключением (группа=0x40028a00) 08-26 14:15:20.905: ERROR/AndroidRuntime(14110): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 08-26 14:15:20.905: ОШИБКА/AndroidRuntime(14110): java.lang.IllegalStateException: это следует вызывать только тогда, когда курсор действителен

Итак, getCount() выполняется, когда я нажимаю элемент, затем следуют два журнала из onItemClickListener с pos и id элемента, по которому щелкнули, а затем снова вызывается getCount()... Наконец, текущая активность приостанавливается, а новая, которую я начать получать это IllegalStateException, что я не могу понять, почему..

Для курсора я использовал managequery() при его запуске.

Любая помощь будет очень благодарна! Спасибо за уделенное время!

Трассировка стека исключения:

08-26 14:35:17.735: ОШИБКА/AndroidRuntime(24173): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: главная

08-26 14:35:17.735: ОШИБКА/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: ОШИБКА/AndroidRuntime (24173): в java.lang.reflect.Method.invokeNative (собственный метод)

08-26 14:35:17.735: ОШИБКА/AndroidRuntime(24173): в java.lang.reflect.Method.invoke(Method.java:521)

08–26 14:35:17.735: ОШИБКА/AndroidRuntime (24173): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

08–26 14:35:17.735: ОШИБКА/AndroidRuntime (24173): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

08–26 14:35:17.735: ОШИБКА/AndroidRuntime (24173): в dalvik.system.NativeStart.main (собственный метод)

А это dumpStack из getCount():

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 освободил 19264 объекта/1052704 байта за 78 мс

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

08-26 14:35:17.705: WARN/System.err(24173): at 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): в java.lang.reflect.Method.invokeNative(собственный метод)

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

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

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

08-26 14:35:17.715: WARN/System.err(24173): at dalvik.system.NativeStart.main(собственный метод)

Таким образом, он вызывается из ListView, но как его можно вызвать после onPause() действия?


person Dimitris Makris    schedule 26.08.2011    source источник
comment
Наконец, я нашел решение (не совсем понимая, почему предыдущий подход не работал..). Вместо manageQuery() я теперь использую query() и закрываю курсор в onDestroy(). Таким образом, я предполагаю, что способ, которым manageQuery управляет жизненным циклом курсора, проблематичен (???), когда активность приостанавливается.   -  person Dimitris Makris    schedule 26.08.2011


Ответы (1)


Вы можете попробовать поместить вызов Thread.dumpStack() в свой метод getCount(), чтобы увидеть, что его вызывает.

Можете ли вы опубликовать трассировку стека из исключения IllegalStateException?

person Joel F    schedule 26.08.2011