2013-03-15 38 views
7

我正在創建一個Android應用程序。此Android應用程序將具有動態的對象。這些對象是帶有地址或緯度/長度的地點,以及距當前位置的距離和ETA。我想要做的就是在帶有邊框的TableLayout上添加對象,但是我需要能夠隨着位置數量的增加而動態添加行。在Android應用程序中添加帶有邊框的動態TableLayout

我對XML的固定硬編碼數量有所瞭解,但是如果對象數量來自Activity.java文件,最佳方式是什麼?

下面是TableLayout的截圖,我想:

Table Layout

所以對象將是一個地址,距離和方向的地方。

回答

7

,但我需要能夠動態地添加行爲的名額增加。

這並不難,當你有一個新的對象追加TableRow的數據到TableLayout

我對xml中固定的硬編碼數量的數據有所瞭解,但如果對象數量來自Activity.java文件,最佳方式是什麼?

我不認爲有一個最佳的方式(或你認爲最好的方式)。您可以:

  • 插入假視圖以充當分隔符。這將更容易實現,但它也會增加應用程序的內存消耗,如果行數很大,則會帶來不好的後果。 (1)
  • 或者使用可繪製的背景來模擬邊界(如九塊圖像)。這會更簡單,然後插入額外的視圖,但你需要更多的才能,使其看起來不錯。(2)

爲圖像的一些例子:

(1)

private static final int DIVIDER_SIZE = 2; 

// rowsCount the number of rows to add to the TableLayout 
private void buildOldSchool(TableLayout table, int rowsCount) { 
    View divider; 
    for (int i = 0; i < rowsCount; i++) { 
     TableRow row = new TableRow(this); 
     for (int j = 0; j < 7; j++) { 
      if (j % 2 == 0) { 
       divider = new View(this); 
       divider.setLayoutParams(new TableLayout.LayoutParams(
         DIVIDER_SIZE, TableLayout.LayoutParams.MATCH_PARENT)); 
       divider.setBackgroundColor(Color.GREEN); 
       row.addView(divider, new TableRow.LayoutParams(
         DIVIDER_SIZE, TableRow.LayoutParams.MATCH_PARENT)); 
       continue; 
      } 
      TextView tv = new TextView(this); 
      tv.setText("DX"); // dummy data 
      row.addView(tv, new TableRow.LayoutParams(
        TableRow.LayoutParams.MATCH_PARENT, 
        TableRow.LayoutParams.WRAP_CONTENT)); 
     } 
     divider = new View(this); 
     divider.setLayoutParams(new TableLayout.LayoutParams(
       TableLayout.LayoutParams.MATCH_PARENT, DIVIDER_SIZE)); 
     divider.setBackgroundColor(Color.GREEN); 
     if (i == 0) { 
      table.addView(divider); 
      divider = new View(this); 
      divider.setLayoutParams(new TableLayout.LayoutParams(
        TableLayout.LayoutParams.MATCH_PARENT, DIVIDER_SIZE)); 
      divider.setBackgroundColor(Color.GREEN); 
     } 
     table.addView(row); 
     table.addView(divider); 
    } 
} 

(2)或與圖像:

private void buildWithDrawables(TableLayout table, int rowsCount) { 
    for (int i = 0; i < rowsCount; i++) { 
     TableRow row = new TableRow(this); 
     row.setBackgroundResource(i == 0 ? R.drawable.firstrow 
       : R.drawable.normalrow); 
     for (int j = 0; j < 3; j++) { 
      TextView tv = new TextView(this); 
      tv.setBackgroundResource(j == 2 ? R.drawable.extra 
        : R.drawable.cell); 
      tv.setText("DX"); 
      row.addView(tv, new TableRow.LayoutParams(
        TableRow.LayoutParams.MATCH_PARENT, 
        TableRow.LayoutParams.WRAP_CONTENT)); 
     } 
     table.addView(row); 
    } 
} 

在哪裏圖像是:

  • R.drawable.cell

  • R.drawable.extra(視覺上透明的可拉伸它複製上述九補丁):

  • R.drawable.normalrow

  • R.drawable.firstrow

忽略我的設計技巧。

如果你預見了大量的行,我會建議你使用ListView,你可以很容易地使它看起來像一張帶有邊框的表格。

+0

這實際上正是我所決定的。我創建了一個可繪製的xml使用。 – yams 2013-03-18 22:24:33

+1

順便謝謝。 – yams 2013-03-19 14:12:20

1

無法弄清楚的垂直線的事,但你可以建立在

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ScrollView sv = new ScrollView(this); 

    TableLayout ll=new TableLayout(this); 
    HorizontalScrollView hsv = new HorizontalScrollView(this); 

    for(int i=1;i<5;i++) { 
     TableRow tbrow=new TableRow(this); 

     for(int j=1;j<=3;j++) { 
      TextView tv1=new TextView(this); 
      tv1.setText("Element :"+ i + "" + j); 
      tbrow.addView(tv1);     
     } 
     ll.addView(tbrow); 
     View v = new View(this); 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 5); 
     v.setLayoutParams(params); 
     v.setBackgroundColor(getResources().getColor(android.R.color.white)); 
     ll.addView(v); 
    } 
    hsv.addView(ll); 
    sv.addView(hsv); 
    setContentView(sv); 
} 
+0

這有點作用,但我有我想要遍歷的對象的列表。 – yams 2013-03-18 19:24:40