2011-09-12 4 views
1

Я хочу создать динамический макет таблицы в потоке (потому что у меня огромная таблица и загрузка довольно длинная). Кажется, что это работает до четвертой строки, но после появления ошибки.Создание динамического tableLayout в потоке

Я не могу найти, где проблема. В этом java-коде макет таблицы был упрощен для финансирования проблемы.

Мой код Java:

public class DialogActivity extends Activity implements Runnable { 

    private TextView tv; 
    private ProgressDialog pd; 


    @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.main); 

      tv = (TextView) this.findViewById(R.id.main1); 
      tv.setText("Press any key to start calculation"); 

      pd = ProgressDialog.show(this, "Working..", "Calculating", true,false); 

      Thread thread = new Thread(this); 
      thread.start(); 

    } 

    public void run() { 
      TableLayout table = (TableLayout)findViewById(R.id.tdyn); 

      TableRow row=null; 
      TextView label = null; 

      int size=10; 
      for (int i = 0; i < size; i++) 
      { 
       row = new TableRow(this); 
       //row.setId(100+i); 
       row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 


       for (int j = 0; j < size; j++) 
       { 
        Log.i("Test",Integer.toString(i) + "-" + Integer.toString(j)); 
        label = new TextView(this); 
        label.setText(Integer.toString(i) + "-" + Integer.toString(j) + " "); 
        label.setLayoutParams(new TableRow.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); 
        label.setGravity(Gravity.CENTER_VERTICAL); 
        row.addView(label); 
       } 

       if(i%2==0) 
        row.setBackgroundColor(0xff222222); 
       else 
        row.setBackgroundColor(0xff000000); 

       table.addView(row); 
      } 
      handler.sendEmptyMessage(0); 


    } 

    private Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       pd.dismiss(); 

        tv.setText("ok"); 

      } 
    }; 



} 

Вот мой XML-код:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:id="@+id/main1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="test" 
    /> 

    <TableLayout android:layout_height="wrap_content" android:id="@+id/tdyn" android:background="#F87907" android:layout_width="fill_parent"> 

         <TableRow> 
          <TextView android:id="@+id/info" 
           android:text="test11" 
           android:textColor="#000000" 
           android:layout_gravity="center_horizontal" /> 

          <TextView android:id="@+id/info" 
           android:text="test12" 
           android:textColor="#000000" 
           android:layout_gravity="center_horizontal" /> 
         </TableRow> 
        </TableLayout> 
        </LinearLayout> 

</LinearLayout> 

Спасибо за вашу помощь

Edit : You can find the the logcat : 


09-12 12:06:57.973: INFO/Test(215): 8-1 
09-12 12:06:57.973: INFO/Test(215): 8-2 
09-12 12:06:57.983: INFO/Test(215): 8-3 
09-12 12:06:57.993: INFO/Test(215): 8-4 
09-12 12:06:58.003: INFO/Test(215): 8-5 
09-12 12:06:58.003: INFO/Test(215): 8-6 
09-12 12:06:58.012: INFO/Test(215): 8-7 
09-12 12:06:58.024: INFO/Test(215): 8-8 
09-12 12:06:58.024: INFO/Test(215): 8-9 
09-12 12:06:58.044: WARN/dalvikvm(215): threadid=15: thread exiting with uncaught exception (group=0x4001b188) 
09-12 12:06:58.044: ERROR/AndroidRuntime(215): Uncaught handler: thread Thread-8 exiting due to uncaught exception 
09-12 12:06:58.073: ERROR/AndroidRuntime(215): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.ViewRoot.checkThread(ViewRoot.java:2683) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.ViewRoot.requestLayout(ViewRoot.java:557) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.View.requestLayout(View.java:7918) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.View.requestLayout(View.java:7918) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.View.requestLayout(View.java:7918) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.View.requestLayout(View.java:7918) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.View.requestLayout(View.java:7918) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.View.requestLayout(View.java:7918) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.widget.TableLayout.requestLayout(TableLayout.java:223) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.ViewGroup.addView(ViewGroup.java:1754) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.widget.TableLayout.addView(TableLayout.java:418) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.ViewGroup.addView(ViewGroup.java:1713) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.widget.TableLayout.addView(TableLayout.java:400) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.view.ViewGroup.addView(ViewGroup.java:1693) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at android.widget.TableLayout.addView(TableLayout.java:391) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at com.sil.DialogActivity.run(DialogActivity.java:65) 
09-12 12:06:58.073: ERROR/AndroidRuntime(215):  at java.lang.Thread.run(Thread.java:1096) 
09-12 12:06:58.102: INFO/Process(52): Sending signal. PID: 215 SIG: 3 
09-12 12:06:58.102: INFO/dalvikvm(215): threadid=7: reacting to signal 3 
09-12 12:06:58.102: ERROR/dalvikvm(215): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 
09-12 12:06:58.464: INFO/ARMAssembler(52): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x546c90:0x546d4c] in 655949 ns 
09-12 12:06:58.663: INFO/ActivityManager(52): Displayed activity com.sil/.DialogActivity: 4121 ms (total 4121 ms) 
+0

В чем проблема заключается в его разработке. а также обновить Logcat –

+0

Вы не можете использовать gridview для этого. –

+0

Спасибо за помощь. Прежде всего, я не могу использовать gridview. У меня есть таблица из более чем 200 строк и около 20 столбцов. Я отправлю logcat. – Miroufle

ответ

4

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

public class DialogActivity extends Activity { 

    private LinearLayout mainLayout; 
    private LinearLayout innerLayout; 
    private TextView tv; 
    private ProgressDialog pd; 
    private int size = 10; 
    private int increment = 0; 
    private TableLayout table; 
    private Context context; 
    private TableRow row; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     context = this; 

     mainLayout = new LinearLayout(context); 
     mainLayout.setLayoutParams(new LinearLayout.LayoutParams(
       LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     mainLayout.setOrientation(LinearLayout.VERTICAL); 

     innerLayout = new LinearLayout(context); 
     innerLayout.setLayoutParams(new LinearLayout.LayoutParams(
       LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     innerLayout.setOrientation(LinearLayout.VERTICAL); 

     tv = new TextView(context); 
     tv.setText("Press any key to start calculation"); 

     table = new TableLayout(context); 
     table.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
     table.setBackgroundColor(Color.parseColor("#F87907")); 

     pd = new ProgressDialog(context); 
     pd.setMessage("Calculating"); 
     pd.setTitle("Working...."); 
     pd.setIndeterminate(true); 
     pd.setMax(size); 
     pd.show(); 

     ThreadRender thread = new ThreadRender(); 
     thread.start(); 

    } 

    private class ThreadRender extends Thread { 

     public void run() { 
      Looper.prepare(); 
      TextView label = null; 

      for (int i = 0; i < size; i++) { 
       row = new TableRow(context); 
       // row.setId(100+i); 
       row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
         LayoutParams.WRAP_CONTENT)); 

       for (int j = 0; j < size; j++) { 
        Log.i("Test", 
          Integer.toString(i) + "-" + Integer.toString(j)); 
        label = new TextView(context); 
        label.setText(Integer.toString(i) + "-" 
          + Integer.toString(j) + " "); 
        label.setLayoutParams(new TableRow.LayoutParams(
          LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
        label.setGravity(Gravity.CENTER_VERTICAL); 
        row.addView(label); 
       } 

       if (i % 2 == 0) { 
        row.setBackgroundColor(0xff222222); 
       } else { 
        row.setBackgroundColor(0xff000000); 
       } 
       table.addView(row); 
       increment++; 
       handler.sendEmptyMessage(101); 
      } 
      handler.sendEmptyMessage(102); 
     } 
    } 

    private Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case 102: 
       innerLayout.addView(tv); 
       innerLayout.addView(table); 
       mainLayout.addView(innerLayout); 
       setContentView(mainLayout); 
       pd.dismiss(); 
       tv.setText("ok"); 
       break; 
      case 101: 
       Log.i("Test", " " + increment); 
       pd.setProgress(increment); 
       break; 
      } 
     } 
    }; 
} 
+0

Спасибо за ваш ответ! Кажется, что я работаю, я проверю его более подробно сегодня вечером (я нахожусь во Франции). Я добавлю свои комментарии и отвечу на ваш ответ в качестве моего принятого ответа. Спасибо! :-) – Miroufle

+0

Какова цель линии: Looper.prepare(); пожалуйста ? – Miroufle

+0

В основном он используется для Message Loop.Пожалуйста, обратитесь к этой ссылке (http://developer.android.com/reference/android/os/Looper.html) для большего удобства использования. –

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