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