Добавление динамического TableLayout с границами в Android-приложение

Я создаю приложение для Android. Это приложение для Android будет иметь динамические объекты. Этими объектами являются места с адресом или широтой/долготой, расстоянием от текущего местоположения и ожидаемым временем прибытия. Что я хотел бы сделать, так это добавить объекты на TableLayout с границами, но мне нужно иметь возможность динамически добавлять строки по мере увеличения количества мест.

Я немного понимаю, как это сделать для фиксированного жестко запрограммированного количества элементов в xml, но как лучше всего, когда количество объектов поступает из файла Activity.java?

Ниже приведен скриншот TableLayout, который я хотел бы:

Макет таблицы

Таким образом, объект будет местом с адресом, расстоянием и направлением.


person yams    schedule 15.03.2013    source источник


Ответы (2)


но мне нужно иметь возможность динамически добавлять строки по мере увеличения количества мест.

Это не сложно, когда у вас есть новый объект, добавляющий 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, который вы можете довольно легко сделать похожим на таблицу с границами.

person user    schedule 18.03.2013
comment
Собственно именно так я и решил. Я создал рисуемый xml для использования. - person yams; 19.03.2013

Не удалось определить вертикальную линию, но что-то, на чем можно основываться

@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);
}
person Royston Pinto    schedule 18.03.2013
comment
Это несколько работает, но у меня есть список объектов, которые я хочу перебрать. - person yams; 18.03.2013