Проблемы с отображением макета на основе XML и динамического добавления текста - PullRequest
1 голос
/ 12 сентября 2009

У меня есть LinearLayout, определенный в XML, который я хочу использовать повторно для отображения элементов списка. XML-макет выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/background"
android:paddingBottom="5px"
>
<TextView  
android:id="@+id/destination"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textSize="22dp"
android:text="@string/test_destination"
android:paddingLeft="5px"
/>

<TextView  
android:id="@+id/date"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:textSize="15dp"
android:text="@string/test_date"
android:paddingLeft="5px"
/>

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/info"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5px"
android:paddingTop="10px" 
>
    <TableRow>
        <TextView
            android:id="@+id/reg_label"
            android:gravity="right"
            android:paddingRight="5px"
            android:text="@string/reg_label" />
        <TextView
            android:text="@string/test_registered"/>
    </TableRow>
    <TableRow>
        <TextView
            android:id="@+id/info_label"
            android:gravity="right"
            android:paddingRight="5px"
            android:text="@string/info_label" />
        <TextView
            android:text="@string/test_info"/>
    </TableRow>
</TableLayout> 
</LinearLayout>

Я собираю информацию об определенных событиях с веб-страницы, а затем хочу отобразить все события в списке, используя приведенный выше макет для каждого события. Мой текущий подход заключается в том, чтобы иметь LinearLayout в качестве родителя, а затем добавлять каждое событие в виде строки.

Проблема номер один - добавить макет к каждому событию (количество событий варьируется). Т.е. я хочу динамически раздувать этот макет для каждого события. Я также не хочу, чтобы текст был жестко запрограммирован в макет (как указано выше), но был добавлен во время выполнения. Я не знаю, как это сделать. Я пробовал что-то вроде следующего без какого-либо успеха.

LinearLayout eventView = (LinearLayout) findViewById(R.layout.event);
parentView.addView(eventView);

Тогда проблема номер два - добавить эти макеты в родительскую группу представлений и отобразить их на экране. Когда я пытаюсь сделать это с помощью parent.addView (child), во время выполнения происходит сбой программы, и я не могу понять, почему.

Довольно сложно описать конкретную проблему, так как я новичок в GUI-программировании на Android и сейчас занимаюсь методом проб и ошибок. Во всяком случае, если вы сможете помочь мне с некоторыми из проблем, это будет с благодарностью.

Linus

EDIT:

Спасибо, comonsware, теперь взгляды надуваются правильно. Теперь проблема заключается в динамическом добавлении текста в TextViews. Я пытаюсь это:

TextView dest = (TextView) findViewById(R.id.destination);
dest.setText("myText");

только чтобы обнаружить, что dest нуль. Есть идеи почему и как это исправить?

РЕДАКТИРОВАТЬ 2:

Я сузил проблему еще больше, но я действительно не понимаю ее природу. Это метод проблем:

private void formatEvents(ArrayList<Event> events, LinearLayout parentView) {
    Log.d(TAG, "formatEvents, size: " + events.size());
    for (Event event : events) {

        LinearLayout eventView = new LinearLayout(this);
        eventView = (LinearLayout) getLayoutInflater().inflate(R.layout.event, null);
        parentView.addView(eventView);

        TextView dest = (TextView) findViewById(R.id.destination);
        TextView date = (TextView) findViewById(R.id.date);
        TextView registered = (TextView) findViewById(R.id.registered);
        TextView info = (TextView) findViewById(R.id.info);
        if (dest == null)
            Log.d(TAG, "null");
        else {
            Log.d(TAG, "not null");
            dest.setText(event.getDestination());
            date.setText(event.getDate());
            registered.setText(event.getDriver() + " " + event.getPassengers());
            info.setText(event.getInfo());
        }
    }       
}

Я получаю нулевое значение для первой итерации, но не для второй. Когда я меняю

parentView.addView(eventView);

до

parentView.addView(eventView, 0);

это как-то работает (хотя события отображаются в обратном порядке). Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

Идентификатор "назначение" принадлежит макету "событие"?

Если это так,

TextView dest = (TextView) findViewById(R.id.destination);
должно быть

TextView dest = (TextView) eventView.findViewById(R.id.destination);
1 голос
/ 12 сентября 2009

В целом, я бы порекомендовал вам использовать ListView, а не LinearLayout в качестве контейнера для ваших строк.

Проблема номер один - добавить макет для каждого события (количество события меняются). Я хочу динамически раздувать этот макет для каждое событие.

parentView.addView(getLayoutInflater().inflate(R.layout.this_is_my_row));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...