Как программно добавить представление во время выполнения в ListActivity без XML - PullRequest
2 голосов
/ 11 февраля 2011

Можно ли вообще создать ListActivity во время выполнения без использования XML? Я пытаюсь создать представление списка из 8 элементов, чередующихся между четырьмя TextViews и четырьмя ToggleButton. Цель состоит в том, чтобы иметь вертикальный список с TextView , ToggleButton , TextView , ToggleButton , TextView , ToggleButton , TextView , ToggleButton

Вот мой код:

public class MyActivity extends ListActivity implements OnCheckedChangeListener
{
    private ViewGroup.LayoutParams widthLayout = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT );
    private TextView[] textItems = new TextView[ 4 ];
    private ToggleButton[] toggleButtons = new ToggleButtons[ 4 ];
    private static final int ID_BASE = 5550;  // unique ID for this activity

    public void onCreate( Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        setupView();
    }
//
    private void setupView() {
        Vector v_itemList = new Vector();
        for ( int i=0; i < 4; i++ ) {
            int t_color = 0xFFFFFF;
            //
            textItems[i] = new TextView( this );
            textItems[i].setText( ""+i+". text line" );
            textItems[i].setColor( t_color );
            t_color -= 0x220022;
            //
            toggleButtons[i] = new ToggleButton( this );
            toggleButtons[i].setTextOff( ""+i+". Off" );
            toggleButtons[i].setTextOn( "On ("+i+")" );
            toggleButtons[i].setId( ID_BASE+i );
            toggleButtons[i].setChecked( i%2 == 1 ? true : false );
            toggleButtons[i].setOnCheckedChangeListener( this );
            //
            v_itemList.addElement( textItems[i] );
            v_itemList.addElement( toggleButtons[i] );
        }
        ArrayAdapter listItemAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, v_itemList );
        this.setListAdapter( listItemAdapter );
    }
}

Когда я попробовал этот код, я получил представление списка всех выводимых элементов toString (): android.widget.TextView@4376f760 android.widget.ToggleButton@437708c8 android.widget.TextView@43772b10 android.widget.ToggleButton@43772fa0 ... т. д ...

Затем я попытался добавить TextView и ToggleButton, используя:

this.addContentView( textItems[i], widthLayout );
this.addContentView( toggleButtons[i], widthLayout );

в цикле for. Но получил исключение RuntimeException, у вашего контента должен быть атрибут id ListView: «android.R.id.list»

Буду признателен за любую помощь, и, если возможно, я бы хотел не использовать ссылки на XML.

1 Ответ

1 голос
/ 11 февраля 2011

Это не то, как вы используете ArrayAdapter. Массив, который вы передаете, должен быть данными, которые будут отображаться, а не представлениями, которые отображают данные. Обычно вы получаете только TextViews из ArrayAdapter. Чтобы получить ваши ToggleButtons, вам нужно создать подкласс ArrayAdapter и переопределить getView ().

Строки, которые вы видите, связаны с тем, что ArrayAdapter обрабатывает ваш массив представлений как отображаемые данные. Стандартное поведение для ArrayAdapter:

Однако ссылка на TextView будет заполнен toString () из каждый объект в массиве

См. Документацию для ArrayAdapter и Учебник по просмотру списка для получения дополнительной информации.

Мне любопытно, почему вы хотите поместить кнопки переключения в ListView. То, что вы описываете, звучит так, как будто бы оно лучше подходит для LinearLayout.

...