7

Androidアプリを作成しています。この Android アプリには、動的なオブジェクトがあります。これらのオブジェクトは、住所または緯度/経度、現在の場所からの距離、および ETA を含む場所です。私がやりたいのはTableLayout、境界線のあるオブジェクトを追加することですが、場所の数が増えるにつれて行を動的に追加できるようにする必要があります。

xml でハードコードされた固定数のアイテムに対してこれを行う方法はある程度理解していますが、オブジェクトの数が Activity.java ファイルから取得されている場合の最善の方法は何でしょうか?

以下は、TableLayout私が望むのスクリーンショットです:

テーブルレイアウト

したがって、オブジェクトは、住所、距離、および方向を持つ場所になります。

4

2 に答える 2

8

ただし、場所の数が増えるにつれて、動的に行を追加できる必要があります。

TableRowこれは難しいことではありません。新しいオブジェクトを使用する場合は、にデータを追加しますTableLayout

xml上の固定されたハードコードされた数のアイテムに対してこれを行う方法はある程度理解していますが、オブジェクトの数がActivity.javaファイルから取得されている場合の最良の方法は何でしょうか。

私は最善の方法(またはあなたが最善の方法と考えるもの)があるとは思いません。あなたのどちらか:

  • 仕切りとして機能する偽のビューを挿入します。これは視覚的に実装するのが簡単ですが、アプリのメモリ消費量も増加し、行数が多いと悪い結果になります。(1)
  • または、背景にドローアブルを使用して、境界線をシミュレートします(9パッチ画像など)。これは、追加のビューを挿入するよりも簡単ですが、見栄えを良くするにはもう少し才能が必要です。(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(上記の9つのパッチを複製する視覚的に透明なドローアブル):

  • R.drawable.normalrow

  • R.drawable.firstrow

私のデザインスキルは無視してください。

多数の行が予想される場合は、を使用することをお勧めします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 に答える