У меня есть представление 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);
}
}
Я пытаюсь выполнить следующее. Рассмотрим этот макет:
Этот макет представляет собой FrameLayout
(внешнее поле), содержащий ImageView
(серым цветом), TextView
(внутренний прямоугольник сверху ) и LinearLayout
(внутренний прямоугольник внизу). Этот прямоугольник LinearLayout
- это тот прямоугольник, который я динамически заполняю несколькими элементами.
После того, как я заполню его, я хочу, чтобы конечный результат был следующим (где каждый новый прямоугольник является новым экземпляром MyListItem
):
То есть все можно прокручивать (например, фоновое изображение , выравнивается по верхнему краю). LinearLayout
не прокручивается сам по себе (все остальное следует), поэтому ListView
, насколько я знаю, не будет работать очень хорошо
в моем случае.