7

我正在创建一个 Android 应用程序。此 Android 应用程序将具有动态对象。这些对象是具有地址或纬度/经度、与当前位置的距离以及预计到达时间的地点。我想做的是在TableLayout带有边框的对象上添加对象,但我需要能够随着位置数量的增加而动态添加行。

我有点了解如何为 xml 上固定的硬编码项目数量执行此操作,但是当对象数量来自 Activity.java 文件时,最好的方法是什么?

下面是TableLayout我想要的截图:

表格布局

所以对象将是一个有地址、距离和方向的地方。

4

2 回答 2

8

但我需要能够随着地方数量的增加而动态添加行。

这并不难,当您有一个新对象将TableRow带有数据的 a 附加到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

忽略我的设计技巧。

如果您预见到大量行,我建议您使用 a ListView,您可以很容易地使它看起来像一个带边框的表格。

于 2013-03-18T20:51:41.370 回答
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);
}
于 2013-03-18T16:26:46.227 回答