У меня есть 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
, насколько я знаю, не будет работать очень хорошо
в моем случае.