【问题标题】:JavaNullPointerException/Layout Error when working with lists and ListView on Android在 Android 上使用列表和 ListView 时出现 JavaNullPointerException/Layout 错误
【发布时间】:2010-12-24 19:35:57
【问题描述】:

嘿,我正在尝试在 Android 上实现一个 ListView,它将打印从 SQLite 数据库检索到的数据。所以我想从表中检索很多列并将其添加到一个列表中,所以我将这个列表打印为一个 ListView。

为此,我创建了一个方法,该方法将在一个单独的类中从表中选择所有列,并且我将在 ListActivity 中打印 ListView。

我要检索表格的 6 列,分别用 ids 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();
        }
    });
}
    }

【问题讨论】:

    标签: android sqlite android-layout android-widget


    【解决方案1】:

    问题是在数据库中如果列值为空,游标返回null,所以,这就是JavaNullPointerException。所以如果数据库中没有要插入的联系人姓名,我插入了一个空字符串。这样可行!

    【讨论】:

      【解决方案2】:

      空指针异常意味着某些东西没有正确初始化。我已经能够从错误日志中破译它似乎是在某处创建列表的位置,但我只看到通用的 android 类,没有来自您的代码。不确定这是否会有所帮助,但看起来错误堆栈的一部分丢失了,它可能会很有帮助,所以...

      【讨论】:

      • 我发布的代码是完整的代码。我已经测试了 selectAll() 方法仅获取 id 0,如下所示:list1.add(cursor.getString(0)) 并且它工作正常。但是在我将 getString(2)、getString(4)、... 和 addAll() 添加到 list1 之后,它没有用。我认为错误是因为我试图同时获得很多列。我不知道我的做法是否正确,但我认为是这样。如果您对此请求有任何解决方案,请在此处发布。谢谢。
      【解决方案3】:

      很确定你的 NPE 在这里

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

      至少这是我对 logcat 的猜测。 R.layout.listitem 是否为空?

      你为什么只使用一个 ArrayAdapter。你可能应该继承CursorAdapter。听起来您想要的东西比 ArrayAdapter 所能提供的更复杂。

      【讨论】:

        【解决方案4】:

        请更改您的查询。您读取未使用的数据。我不知道确实存在多少行和列,但您可能会看到性能略有提升。

        问候 hjw

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-12
          • 2013-06-29
          • 2021-12-24
          • 1970-01-01
          • 1970-01-01
          • 2012-08-17
          • 1970-01-01
          相关资源
          最近更新 更多