Ho una vista LinearLayout
che contiene già diversi elementi. Voglio aggiungere molte più viste ad esso, a livello di programmazione. E poiché questo è all'interno di un ScrollView
, tutto verrà fatto scorrere.Qual è il modo più rapido per aggiungere più viste a un LinearLayout?
Quindi quello che faccio è passare attraverso la mia lista e aggiungere nuove istanze della mia visualizzazione personalizzata ad esso. Quella vista personalizzata gonfia un layout XML e aggiunge alcuni metodi.
Questo approccio funziona bene. Il problema è che è super lento, anche senza alcun codice pazzo ... una lista con 10 elementi richiede circa 500ms per istanziare. Dal punto di vista dell'esperienza utente, è difficile da digerire.
La mia domanda è, è questo l'approccio corretto/migliore? Android sembra impiegare molto tempo a gonfiare il layout, anche se "R.layout.my_list_item" è semplicissimo. Mi chiedo se c'è un modo forse per riutilizzare i layout "gonfiati" per ulteriori visualizzazioni, un po 'come mettere in cache l'analisi più complessa?
Ho provato a farlo con uno ListView
(e adattatore e un wrapper) e sembra essere molto più veloce. Il problema è che non posso usare un semplice ListView
; il mio layout è più complesso di un semplice elenco (lo stesso LinearLayout
contiene icone personalizzate aggiuntive e ha un altro genitore con un numero ancora maggiore di visualizzazioni prima che venga spostato dallo ScrollView
).
Ma esiste un modo per utilizzare un adattatore per LinearLayout? Sarebbe più veloce di provare ad aggiungere le visualizzazioni da solo?
Qualsiasi aiuto è apprezzato. Mi piacerebbe farlo più velocemente.
Il codice segue.
attività principale:
// 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);
}
}
Quello che sto cercando di realizzare è questo. Considerare questo layout:
Questo layout è un (scatola esterna) FrameLayout
contenente (in grigio), un (rettangolo interno, sulla parte superiore) ImageView
TextView
e un LinearLayout
(rettangolo interno, sul fondo). Questo rettangolo LinearLayout
è quello che sto popolando in modo dinamico con alcuni elementi.
Dopo Io popolo, voglio il risultato finale di essere presente (in cui ogni nuovo rettangolo è un nuovo MyListItem
esempio):
Cioè, tutto è scorrevole (l'immagine di sfondo, per esempio, è allineato in alto). Il LinearLayout
non è scorrevole da solo (tutto il resto segue), quindi perché un ListView
, da quello che so, non funzionerebbe molto bene nel mio caso.
Quanti elementi hai in quell'attività e hai qualche classe personalizzata che eredita elementi dell'interfaccia utente? –
Le visualizzazioni delle liste sono così veloci perché riciclano i layout degli articoli. Gonfiano il numero di layout degli elementi richiesti per riempire lo schermo. Quando scorri verso il basso, una vista in alto viene nascosta e una in basso viene mostrata. La listview prende il vecchio, invisibile dall'alto e lo mette con i nuovi dati in basso. Evita l'inflazione costosa. Complessivamente: questo qui sembra * molto * inefficiente, sono abbastanza sicuro di ciò che si possa fare con un listview. Se mostri ciò che hai provato e pubblichi uno schizzo del tuo layout, possiamo aiutarti a capirlo. –
Paul: non molti elementi. Forse 4 o 5. Sì, alcuni di loro sono classi personalizzate che ereditano dal framework di base. alextsc: grazie per la spiegazione. Ho aggiunto un diagramma che spiega meglio la mia situazione, quindi è chiaro se e come potrei usare un ListView invece (o meno). – zeh