Android первая TableRow не отображается

У меня странная проблема. Я получил MessageRow от TableRow. Я заполнил таблицу одним TableRow (заголовком) и 100 MessageRows. Но когда я добавляю таблицу в представление HorizontalScroll, отображаются только строки сообщений. Если я проверю таблицу в отладчике, все строки там, включая заголовок, с правильными дочерними элементами и текстом.

Это упрощенный код:

public class MessageRow extends TableRow {
    public TextView tvData1;
    public TextView tvData2;
    public TextView tvData3;

    public MessageRow(Context context) {
        this(context, null);
    }

    public MessageRow(Context context, AttributeSet attrs) {
        super(context, attrs);
        tvData1 = new TextView(context);
        tvData2 = new TextView(context);
        tvData3 = new TextView(context);
    }

    public void setData(String data1, String data2, String data3) {
        tvData1.setText(data1);
        tvData2.setText(data2);
        tvData3.setText(data3);

        addView(tvData1);
        addView(tvData2);
        addView(tvData3);
    }
}

Код активности:

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewer);

        mTable = new TableLayout(this);

        HorizontalScrollView hview = (HorizontalScrollView) findViewById(R.id.hscroll);
        mTable.setBackgroundColor(Color.WHITE);
        populate(mTable);
        hview.addView(mTable);
    }


    public void setHeader(TableLayout tl) {
        TableRow mHeader = new TableRow(getContext());
        mHeader.addView(getColumnHeader("Data#1"));
        mHeader.addView(getColumnHeader("Data#2"));
        mHeader.addView(getColumnHeader("Data#3"));
        mHeader.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        tl.addView(mHeader);
    }

    public void populate(TableLayout tl) {
        setHeader(tl);
        for(int i = 0; i < 100; i++) {
            MessageRow mr = new MessageRow(getContext());
            mr.setMessage("xxx"+i,"yyy"+i,"zzz"+i);
            mr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            tl.addView(mr);
        }
    }

    private Button getColumnHeader(String name) {
        Button bt = new Button(getContext());
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        params.rightMargin = params.leftMargin = 2;
        bt.setLayoutParams(params);
        bt.setText(name);
        return bt;
    }



Теперь я попытался обойти функцию getColumnHeader() следующим образом:

    public void setHeader(TableLayout tl) {
        TableRow mHeader = new TableRow(getContext());
        //mHeader.addView(getColumnHeader("Data#1"));
-->         Button bt1 = new Button(getContext());
-->         bt1.setText("Data#1");
-->         mHeader.addView(bt1);
        //mHeader.addView(getColumnHeader("Data#2"));
-->         Button bt2 = getColumnHeader("Data#2");
-->         mHeader.addView(bt2);

        mHeader.addView(getColumnHeader("Data#3"));
        mHeader.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        tl.addView(mHeader);
    }

а затем отображается bt1 (Data#1)!!! но не данные № 2 или данные № 3. Это намекает на то, что каким-то образом функция getColumnHeader() работает неправильно. Но не в соответствии с отладчиком, когда я проверяю bt1 и bt2, они кажутся хорошими, я не могу определить, в чем разница между созданной вручную кнопкой bt1 и возвращенной кнопкой bt2.

Примечание: я не знаю, лучший ли это способ, но чтобы сравнить две переменные, я просто щелкнул правой кнопкой мыши и скопировал переменную, а затем вставил ее в блокнот++ в два разных файла (один для bt1 и один для bt2). ) и использовали подключаемый модуль сравнения.


person ilomambo    schedule 21.04.2012    source источник


Ответы (2)


Еще немного информации.
Мне удалось отобразить кнопки, дальнейшая отладка показала, что установка параметров Layout для каждой кнопки в функции getColumnHeader() вызвала проблему.
Тем не менее, я не вижу. знаю, почему.

Элемент кнопки mLayoutParams, имеющий значение null, в порядке, но когда он создан (.setLAyoutParams()) и ему присвоены значения (например, ширина и высота), кнопка внезапно перестала отображается.
Это патч,... пока я не выясню, почему.

private Button getColumnHeader(String name) {
    Button bt = new Button(getContext());
    //LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    //params.rightMargin = params.leftMargin = 2;
    //bt.setLayoutParams(params);
    bt.setText(name);
    return bt;
}
person ilomambo    schedule 22.04.2012

Последняя часть головоломки.
Я перепробовал множество вариантов, и наконец это сработало!
Замена LayoutParams на TableRow.LayoutParams помогла.
Их структура очень похож, возможно, даже TableRow.LayoutParams является производным от LayoutParams.
Я оставлю здесь загадку, пока какой-нибудь эксперт не прольет свет на то, почему это произошло.

Окончательный код:

private Button getColumnHeader(String name) {
    Button bt = new Button(getContext());
    TableRow.LayoutParams params = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
    params.rightMargin = params.leftMargin = 2;
    bt.setLayoutParams(params);
    bt.setText(name);
    return bt;
}
person ilomambo    schedule 22.04.2012
comment
Если вы нашли решение своей проблемы, примите свой собственный ответ, чтобы вопрос был помечен как отвеченный. - person user; 22.04.2012