Mam widok LinearLayout
, który zawiera już kilka elementów. Chcę programowo dodać do niego o wiele więcej widoków. A ponieważ jest to wewnątrz ScrollView
, wszystko zostanie przewinięte.Jaki jest najszybszy sposób dodania kilku widoków do LinearLayout?
Więc to, co robię, to przeglądanie mojej listy i dodawanie nowych instancji do mojego niestandardowego widoku. Ten widok niestandardowy nadpisuje układ XML i dodaje kilka metod.
To podejście działa dobrze. Problem polega na tym, że jest bardzo powolny, nawet bez szalonego kodu ... Lista z 10 elementami zajmuje około 500 ms, aby utworzyć instancję. Z punktu widzenia wygody użytkownika trudno to połknąć.
Moje pytanie brzmi: czy to jest właściwe/najlepsze podejście? Wydaje się, że system Android zajmuje dużo czasu nadymaniem układu, mimo że "R.layout.my_list_item" jest bardzo prosty. Zastanawiam się, czy istnieje sposób, aby ponownie użyć "nadęty" układ dla dodatkowych widoków, czy raczej buforowanie bardziej złożonych analiz?
Próbowałem to zrobić z ListView
(i adapter i opakowanie) i wydaje się, że jest znacznie szybciej. Problem polega na tym, że nie mogę użyć zwykłego ListView
; mój układ jest bardziej złożony niż prosta lista (sama wersja LinearLayout
zawiera dodatkowe niestandardowe ikony i ma innego rodzica z jeszcze większą liczbą wyświetleń, zanim zostanie zapakowana przez ScrollView
).
Ale czy istnieje sposób użycia adaptera do LinearLayout? Czy byłoby to szybsze niż próba samodzielnego dodania widoków?
Każda pomoc jest doceniana. Chciałbym zrobić to szybciej.
Kod następuje.
Główna działalność:
// 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);
}
}
Co próbuję wykonać jest to. Rozważmy następujący układ:
Ten układ jest FrameLayout
(karton) zawierający ImageView
(szary) w TextView
(wewnętrzny prostokąta, na górze) i LinearLayout
(wewnętrzny prostokąta, na dole). Ten prostokąt LinearLayout
jest tym, który dynamicznie zapełniam kilkoma elementami.
Po wypełnić go, chcę końcowy wynik będzie to (gdzie każdy nowy prostokąt jest nowy MyListItem
instancja):
Oznacza to, że wszystko jest przewijana (obraz tła, na przykład jest wyrównany na górze). LinearLayout
nie można przewijać samodzielnie (wszystko inne następuje), dlatego w moim przypadku ListView
, z tego, co wiem, nie działałoby zbyt dobrze .
Ile elementów posiadasz w tej czynności i czy posiadasz niestandardową klasę dziedziczącą elementy interfejsu użytkownika? –
ListViews są tak szybkie, ponieważ przetwarzają układy przedmiotów. Nadymają liczbę układów przedmiotów wymaganych do wypełnienia ekranu. Gdy przewiniesz w dół, jeden widok na górze zostanie ukryty, a jeden na dole zostanie wyświetlony. Listview pobiera stary, niewidoczny z góry i umieszcza go z nowymi danymi na dole. Unika kosztownej inflacji. Ogólnie: tutaj wygląda * bardzo * nieefektywnie, jestem prawie pewien, że to, co chcesz zrobić, można osiągnąć dzięki listview. Jeśli pokażesz, co wypróbowałeś i opublikujesz szkic zamierzonego układu, pomożemy Ci go wymyślić. –
Paul: mało elementów. Może 4 lub 5. Tak, niektóre z nich są niestandardowymi klasami, które dziedziczą po podstawowej strukturze. alextsc: dzięki za wyjaśnienie. Dodałem schemat, który lepiej wyjaśnia moją sytuację, więc jest jasne, czy i jak mogę zamiast tego użyć ListView. – zeh