Какой самый быстрый способ добавить несколько представлений в LinearLayout?

У меня есть представление LinearLayout , которое уже содержит несколько элементов. Я хочу программно добавить к нему намного больше представлений. И поскольку это внутри ScrollView , все будет прокручиваться.

Я просматриваю свой список и добавляю в него новые экземпляры своего пользовательского представления. Это настраиваемое представление расширяет XML-макет и добавляет несколько методов.

Этот подход работает хорошо. Проблема в том, что он очень медленный, даже без сумасшедшего кода ... для создания списка из 10 элементов требуется около 500 мс. С точки зрения пользовательского опыта это трудно проглотить.

Мой вопрос: это правильный / лучший подход? Android, кажется, требует много времени, чтобы раздуть макет, хотя "R.layout.my_list_item" очень прост. Интересно, есть ли способ, возможно, повторно использовать «раздутые» макеты для дополнительных представлений, как бы кэшируя более сложный синтаксический анализ?

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

Но есть ли способ использовать адаптер для LinearLayout? Будет ли это быстрее, чем пытаться добавить представления самостоятельно?

Любая помощь приветствуется. Я бы хотел сделать это быстрее.

Код следует.

Основное действие:

// The LinearLayout that will contain everything
lineList = (LinearLayout) findViewById(R.id.lineList);

// Add a lot of items for testing
for (int i = 0; i < 10; i++) {
    addListItem("Item number " + i);
}

protected void addListItem(String __title) {
    MyListItem li;
    li = new MyListItem(this);
    li.setTitle(__title);
    lineList.addView(li);       
}

MyListItem:

public class MyListItem extends RelativeLayout {

    protected TextView textTitle;

    public MyListItem(Context __context) {
        super(__context);
        init();
    }

    public MyListItem(Context __context, AttributeSet __attrs) {
        super(__context, __attrs);
        init();
    }

    public MyListItem(Context __context, AttributeSet __attrs, int __attrsdefStyle) {
        super(__context, __attrs, __attrsdefStyle);
        init();
    }

    protected void init() {
        // Inflate the XML layout
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.my_list_item, this);

        // Create references
        textTitle = (TextView)findViewById(R.id.textTitle);
    }

    public void setTitle(String __text) {
        textTitle.setText(__text);
    }
}

Я пытаюсь выполнить следующее. Рассмотрим этот макет:

Basic layout

Этот макет представляет собой FrameLayout (внешнее поле), содержащий ImageView (серым цветом), TextView (внутренний прямоугольник сверху ) и LinearLayout (внутренний прямоугольник внизу). Этот прямоугольник LinearLayout - это тот прямоугольник, который я динамически заполняю несколькими элементами.

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

Populated layout

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

16
задан zeh 16 December 2011 в 22:36
поделиться