2010-08-23 2 views
2

Я постараюсь быть конкретным, если смогу - пожалуйста, будьте терпеливы, впервые обжалуйтесь и относительно новичок в программировании на этой платформе. Извините, если это было спрошено/ответили раньше - свяжите его со мной. Я искал вверх и вниз, но обнаружил другие не связанные (по крайней мере) проблемы.Аварийный адаптер адаптера пользовательского списка в bindView на эмуляторе - не на телефоне

Настоящий puzzler для меня - это то, что мое приложение рушится на моем эмуляторе, но когда оно установлено на моем телефоне (через загрузку 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) 

Любопытно меня счастливо программирования и отладки прочь весь день и из голубых длинные рабочих и ошибки свободная часть моего приложения теперь бросают эту ошибку.

Я подозреваю, что это может быть проблема с базами данных, но на самом деле не уверен - ничего не стоит здесь. До сегодняшнего дня у меня была база данных с одной таблицей - сегодня я добавил новую таблицу, в которой также есть поле «_id» в качестве поля ключа автоинкремента имени, которое я прочитал в документах, для адаптеров списка Android (если используется память) , Имея некоторый опыт в области кодирования и некоторый небольшой опыт работы с базами данных, это кажется мне плохой идеей, но я не уверен, что это проблема и/или как это сделать.

Сбой, который я перечисляю здесь, не отображает или не делает ссылку на данные в другой, новой таблице. Курсор не содержит никаких данных запроса. На самом деле, если я переименую ключевое поле «_id» в новую таблицу на что-то другое (т.е. «_blah»), крах остается.

Как я уже сказал, если я загружаю apk на свой телефон, он работает.

Я попытался следующий на эмуляторе: - повторный запуск ADB (и затмение) - никакого результата - удаление из эмулятора - никакого результата - не Destory профиля AVD и воссоздавать - никакого результата

Я разрабатываю этот под Android 2.1 SDK, и были в течение последних нескольких недель. У меня только когда-то был установлен SDK, я еще не обновился до версии 2.2.

Не знаю, что еще я могу здесь сказать - надеясь, что кто-то здесь имеет достаточно опыта, чтобы пролить свет на него.

Без исправления, я могу предвидеть очень медленный процесс разработки здесь (при условии, что мне нужно загрузить на свой телефон, чтобы протестировать новые изменения кода ...).

Извините за то, что я долгое время намотка - надеюсь, что я предоставляю достаточно информации для одного из вас умнее людей, чтобы прибить это. Спасибо

ответ

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/GridView с ListView.setAdapter (...), и пусть волшебство произойдет.

+0

ФП цепочки реализации суперкласса из 'BindView()', который является вполне разумным. – CommonsWare

+0

Хммм - а победитель radek-k Но почему? Я хочу объяснить, пожалуйста, чтобы я мог учиться. Я не думал, что это проблема, потому что (а) она была в учебниках и (б) мое приложение работает с этим довольно долгое время. Но, для пинков, я думал, что прокомментирую это и престо, приложение теперь счастливо работает. Я также попытался вернуть все обратно к тому, как я это сделал, прежде чем предлагать предложения здесь, и он все еще работает с этой строкой, прокомментированной. Ответы? Обоснование? Пожалуйста? – Adriaan

0

Посмотрите немного вверх по журналам logcat.Вы можете обнаружить, что есть ошибка SQL (обычно желтая), и она может сказать что-то о неоднозначном имени столбца. Возможно, вам нужно будет добавить имя таблицы, за которой следует период, чтобы получить столбец _id.

У меня была эта проблема вчера из-за этой проблемы.

Почему это может не случиться на вашем телефоне, потому что у вас может не получиться новая таблица, правильно созданная на телефоне. Попробуйте очистить данные (используя управляющие приложения) и снова запустить приложение.

Я на 95% уверен, что ваша проблема - неоднозначные имена столбцов, и вы найдете ее в логарифме чуть выше, чем ошибка, которую вы опубликовали, возможно, 3 строки выше.

+0

Я не видел линии logcat. Я также попытался вставить имя таблицы, за которым следует полная остановка, без изменений. Теперь я вижу несколько строк относительно реферансов, за которыми следуют идентификационные коды. Однако они не существуют в моем файле R.id. Странный? – Adriaan

+0

Можете ли вы разместить немного больше логарифма над ошибкой, которую вы уже опубликовали. Может помочь нам немного. Кажется, очень странная ошибка – matto1990

+0

Будет делать - когда я снова получу доступ к своему коду. К сожалению, кодирование - это не моя дневная работа! : p – Adriaan

0

Глядя на Android 2.2 исходный код, единственным способом я вижу SimpleCursorAdapter «s bindView() возможно воспитывающей NullPointerException есть если to массив вы поставляется в конструктор был null или если Cursor вы указали в конструктор был null.

Теперь есть определенные изменения в SimpleCursorAdapter между 2.1 и 2.2, так как строка 149 версии 2.2 не находится в bindView(). Следовательно, может быть и другой возможный случай для NullPointerException в 2.1, который я не вижу в 2.2.

+0

Извините за выделение кода в этом комментарии. Сообщение на мобильном телефоне в лучшем случае затруднено. Когда в режиме отладки с точками останова я вижу, что курсор, который я передаю, не является нулевым, как в нем, кажется, привязан к SQL-запросу. Что я должен искать в качестве окончательного способа узнать, является ли оно нулевым? В массиве определенно не пусто. Будет ли еще одна возможность быть неразрешимой? Я добавил несколько новых макетов в течение последнего дня, и я не думаю, что удвоил имена имен, но может ли это сделать? – Adriaan

1

Ваша проблема в том, что вы не переопределяете методы getViewTypeCount и getViewType. Если вы не переопределите эти методы, иногда Android вызовет ваш getView с параметром «convertView» неправильного типа, если вы передадите этот параметр в getView адаптера, вы получите исключение NullPointerException, когда оно попытается повторно использовать объект.

Почему это работает в телефоне ?. Я не уверен, возможно, версия SimpleCursorAdapter в телефоне проверяет, что параметр «convertView», который вы передаете, имеет правильный тип. Я нашел случай, который разбил эмулятор 2.1, но не 1.5, 1.6, 2.2 или мой телефон.

Если вы хотите попробовать более простой способ решения проблемы (но менее оптимальный), вы всегда можете передать параметр «convertView» в SimpleCursorAdapter как «null». Таким образом, SimpleCursorAdapter никогда не будет повторно использовать какой-либо вид, но он работает в любом месте (эмулятор всех версий + телефон).

Вы можете проверить этот учебник Джефф Шарки

Separating Lists with Headers in Android 0.9

Смежные вопросы