2011-09-12 10 views
1

スレッドで動的なテーブルレイアウトを作成したい(私は巨大なテーブルを持っており、読み込みはかなり長いため)。 4行目まで動作しているようですが、エラーが表示された後です。スレッド内で動的な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> 

はbelow.There書かれたコードを試してみてくださいあなたの助け

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

ありがとうございれますあなたの現在のコードからいくつかの変更。すべてのものは、コードを介して動的に生成されます。

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)を参考にしてください。 –

関連する問題