动态地将TableRow添加到TableLayout中的空指针异常

时间:2012-09-25 04:25:10

标签: android android-tablelayout

我在浏览时遇到了一个概念,即创建动态表行并为其添加内容。在下面描述代码 此代码抛出NullPointerException。

布局:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:stretchColumns="0,1"
                android:id="@+id/tabledisplay" android:layout_weight="1" android:layout_height="wrap_content" android:layout_width="match_parent">
        </TableLayout>

代码

public void display_table(){
    try{
    TableLayout tl = (TableLayout)findViewById(R.id.tabledisplay);

    DBConnection db= new DBConnection();
    Connection con=db.getConnection();
    Statement st=con.createStatement();
    ResultSet rs=st.executeQuery("select report_name,report_createddate,user_name from reports");
    TableRow tr_head = new TableRow(this);
    tr_head.setId(10);
    tr_head.setBackgroundColor(Color.GRAY);
    tr_head.setLayoutParams(new LayoutParams(
    LayoutParams.FILL_PARENT,
    LayoutParams.WRAP_CONTENT));
    TextView label_date = new TextView(this);
    label_date.setId(20);
    label_date.setText("DATE");
    label_date.setTextColor(Color.WHITE);
    label_date.setPadding(5, 5, 5, 5);
    tr_head.addView(label_date);// add the column to the table row here

    TextView label_weight_kg = new TextView(this);
    label_weight_kg.setId(21);// define id that must be unique
    label_weight_kg.setText("Wt(Kg.)"); // set the text for the header 
    label_weight_kg.setTextColor(Color.WHITE); // set the color
    label_weight_kg.setPadding(5, 5, 5, 5); // set the padding (if required)
    tr_head.addView(label_weight_kg); // add the column to the table row here
    tl.addView(tr_head, new TableLayout.LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT));
    Integer count=0;
    while (rs.next()) {
   String date = (rs.getString(1));// get the first variable
   String weight_kg = (rs.getString(2));// get the second variable
   // Create the table row
   TableRow tr = new TableRow(this);
   if(count%2!=0) tr.setBackgroundColor(Color.GRAY);
   tr.setId(100+count);
   tr.setLayoutParams(new LayoutParams(
   LayoutParams.FILL_PARENT,
   LayoutParams.WRAP_CONTENT));

   //Create two columns to add as table data
    // Create a TextView to add date
   TextView labelDATE = new TextView(this);
   labelDATE.setId(200+count); 
   labelDATE.setText(date);
   labelDATE.setPadding(2, 0, 5, 0);
   labelDATE.setTextColor(Color.WHITE);
   tr.addView(labelDATE);
   TextView labelWEIGHT = new TextView(this);
   labelWEIGHT.setId(200+count);
   labelWEIGHT.setText(weight_kg.toString());
   labelWEIGHT.setTextColor(Color.WHITE);
   tr.addView(labelWEIGHT);

   // finally add this to the table row
   tl.addView(tr, new TableLayout.LayoutParams(
                        LayoutParams.FILL_PARENT,
                        LayoutParams.WRAP_CONTENT));
               count++;
            }   


    }catch (Exception e) {
        // TODO: handle exception
        Toast.makeText(getApplicationContext(),e.toString(),Toast.LENGTH_LONG).show();
    }

}

请告诉我代码中出了什么问题?

LOG错误

09-25 10:02:58.125: I/System.out(560): java.lang.NullPointerException 09-25
10:02:58.154: I/System.out(560):    at  
android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:100) 09-25  
10:02:58.154: I/System.out(560):    at
co.analuo.app.HorzScrollWithListMenu.display_table(HorzScrollWithListMenu.java:189) 
09-25 10:02:58.164: I/System.out(560):  at 
co.analuo.app.HorzScrollWithListMenu$1.onItemClick(HorzScrollWithListMenu.java:111)   
09-25 10:02:58.164: I/System.out(560):  at 
android.widget.AdapterView.performItemClick(AdapterView.java:284) 09-25 10:02:58.164:  
I/System.out(560):  at android.widget.ListView.performItemClick(ListView.java:3513) 
09-25 10:02:58.164: I/System.out(560):  at 
android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) 09-25 10:02:58.175: 
I/System.out(560):  at android.os.Handler.handleCallback(Handler.java
:587)
09-25 10:02:58.185: I/System.out(560):  at   
android.os.Handler.dispatchMessage(Handler.java:92)
09-25 10:02:58.185: I/System.out(560):  at android.os.Looper.loop(Looper.java:123)
09-25 10:02:58.185: I/System.out(560):  at 
android.app.ActivityThread.main(ActivityThread.java:3683)
09-25 10:02:58.204: I/System.out(560):  at 
java.lang.reflect.Method.invokeNative(Native Method)
09-25 10:02:58.204: I/System.out(560):  at 
 java.lang.reflect.Method.invoke(Method.java:507)
 09-25 10:02:58.204: I/System.out(560):     at 
 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-25 10:02:58.204: I/System.out(560):  at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-25 10:02:58.204: I/System.out(560):  at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

我有同样的问题所以这是你的解决方案..     不要将Tablelayout作为根布局 e.g

`<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TableLayout
    android:id="@+id/tlayoutID"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>`

答案 1 :(得分:0)

最后我得到了解决方案

如果findViewById()正在返回NPE,请尝试其中一些:

  • 通过项目清理项目 - &gt;干净...... - &gt;检查你的项目 - &gt;行
  • 确保ID
  • 中绝对没有拼写错误
  • 确保contentView显示TableLayout存在的正确布局
  • 确保setContentView
  • 之前findViewById

我假设我列出的第三个选项很可能是你的问题。

在完成上述每个步骤后,重新清洁项目也会有所帮助。

来自https://stackoverflow.com/a/11671533/1602230