JavaNullPointerException / Layout Ошибка при работе со списками и ListView на Android - PullRequest
1 голос
/ 24 декабря 2010

Эй, я пытаюсь реализовать ListView на Android, который будет печатать данные, полученные из базы данных SQLite. Поэтому я хочу извлечь много столбцов из таблицы и добавить их в список, чтобы распечатать этот список как ListView.

Для этого я создал метод, который будет выбирать все столбцы из таблицы в отдельном классе, и я буду печатать ListView в ListActivity.

Я хочу получить 6 столбцов таблицы, которая представлена ​​идентификаторами 2, 4, 5, 6, 7, 9.

Но это показывает много ошибок:

12-24 19:19:04.066: ERROR/AndroidRuntime(22630): FATAL EXCEPTION: main
12-24 19:19:04.066: ERROR/AndroidRuntime(22630): java.lang.NullPointerException
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.AbsListView.obtainView(AbsListView.java:1418)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.ListView.makeAndAddView(ListView.java:1745)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.ListView.fillDown(ListView.java:670)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.ListView.fillFromTop(ListView.java:727)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.ListView.layoutChildren(ListView.java:1598)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.AbsListView.onLayout(AbsListView.java:1248)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.View.layout(View.java:7175)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.os.Looper.loop(Looper.java:123)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at android.app.ActivityThread.main(ActivityThread.java:3647)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at java.lang.reflect.Method.invokeNative(Native Method)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at java.lang.reflect.Method.invoke(Method.java:507)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-24 19:19:04.066: ERROR/AndroidRuntime(22630):     at dalvik.system.NativeStart.main(Native Method)

Вот код метода, который выбирает данные.

public List<String> selectAll() {

    List<String> list1 = new ArrayList<String>();
    List<String> list2 = new ArrayList<String>();
    List<String> list3 = new ArrayList<String>();
    List<String> list4 = new ArrayList<String>();
    List<String> list5 = new ArrayList<String>();
    List<String> list6 = new ArrayList<String>();

    Cursor cursor = this.db.query(TABLE_NAME, null, null, null, null, null,
            "duration desc");

    if (cursor.moveToFirst()) {
        do {

            list1.add(cursor.getString(2));
            list2.add(cursor.getString(4));
            list3.add(cursor.getString(5));
            list4.add(cursor.getString(6));
            list5.add(cursor.getString(7));
            list6.add(cursor.getString(9));

            list1.addAll(list2);
            list1.addAll(list3);
            list1.addAll(list4);
            list1.addAll(list5);
            list1.addAll(list6);

        } while (cursor.moveToNext());
        Log.i(TAG, "After cursor.moveToNext()");
    }
    if (cursor != null && !cursor.isClosed()) {
        cursor.close();
    }
    Log.i(TAG, "Before selectAll returnment");
    return list1;
}

А вот код класса ListActivity:

public class RatedCalls extends ListActivity {

private static final String LOG_TAG = "RatedCallsActivity";
private CallDataHelper cdh;
StringBuilder sb = new StringBuilder();
OpenHelper openHelper = new OpenHelper(RatedCalls.this);

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    Log.i(LOG_TAG, "calling from onCreate()");

    cdh = new CallDataHelper(this);

    Log.i(LOG_TAG, "--->>> before calling the service");
    startService(new Intent(this, RatedCallsService.class));
    Log.i(LOG_TAG, "Service called.");
    Log.i(LOG_TAG, "--->>> after calling the service");
    fillList();

}

public void fillList() {

    List<String> ratedCalls = this.cdh.selectAll();

    setListAdapter(new ArrayAdapter<String>(this, R.layout.listitem,
            ratedCalls));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // When clicked, show a toast with the TextView text
            Toast.makeText(getApplicationContext(),
                    ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
        }
    });
}
    }

Ответы [ 4 ]

1 голос
/ 25 декабря 2010

Проблема заключалась в том, что в базе данных, если значение столбца было пустым, курсор возвращал ноль, так что это было исключение JavaNullPointerException. Поэтому, если в базе данных не было контактного имени, я вставил пустую строку. Это работает!

0 голосов
/ 25 декабря 2010

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

С уважением, hjw

0 голосов
/ 25 декабря 2010

Уверен, что ваш NPE здесь

setListAdapter(new ArrayAdapter<String>(this, R.layout.listitem, ratedCalls));

По крайней мере, это мое предположение из logcat. R.layout.listitem имеет значение null?

Почему вы используете только ArrayAdapter. Вы должны вероятно подкласс CursorAdapter. Похоже, вы хотите что-то более сложное, чем может дать вам ArrayAdapter.

0 голосов
/ 25 декабря 2010

Исключение нулевого указателя означает, что что-то не инициализировано правильно.Я смог расшифровать из журнала ошибок, что кажется, что где-то создается список, но я вижу только общие классы Android, но ничего внутри вашего кода.Не уверен, что это поможет, но похоже, что отсутствует часть стека ошибок, это может быть весьма полезно, так что ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...