2012-04-11 13 views
9

Ho un ListView che ha un TextView e in ogni TextView diversi articoli, ciascuno con una breve descrizione. Per applicare stili diversi agli articoli e alla descrizione, utilizzo gli oggetti con intervallo multiplo: ClickableSpan, ForegroundColorSpan, BackgroundColorSpan, AbsoluteSizeSpan e StyleSpan.È meglio utilizzare più SpanObjects o più TextView in Android?

Mediamente il ListView ha 10 TextView s, e ogni TextView ha 10 paia di voce/descrizione e ciascuna coppia utilizza circa 6 SpanObject s così un totale di 600 ~ SpanObject s per ListView. E quando l'utente fa clic su uno degli elementi, lo ListView viene cancellato e ridisegnato di nuovo generando un altro set di 600 SpanObject s.

Quindi mi chiedo se sarebbe una migliore idea di creare uno TextView per ogni elemento e ogni descrizione e formattarlo tramite XML, piuttosto che lo styling dei TextView s con passaggio, in questo modo non ci sarebbe di circa 200 TextView s e non SpanObject s.

Come nota, non ho cominciato con questo approccio perché l'albero gerarchia di vista sarebbe stato più complesso e TextView s sono più costosi per creare che i SpanObject s, ma ora che vedo il numero di SpanObject s I sto creando non sono sicuro di cosa sia meglio. Sto anche pensando di iniziare a scrivere un meccanismo di riciclaggio, ma non sono sicuro che valga la pena o questo non dovrebbe essere un problema per Android GC.

risposta

1

So che sono passati due anni da quando hai fatto questa domanda, e spero che tu abbia già trovato una risposta, ma ho pensato di rispondere comunque alla tua domanda.

La quantità di TextViews e SpanObjects che hai sono incredibilmente costosi per qualsiasi dispositivo Android, e caricarli ogni volta non solo possono causare lag, ma probabilmente un arresto anomalo di OOM (memoria insufficiente).

L'approccio per risolvere questo problema è l'utilizzo di RecyclerView e CardView. Innanzitutto, scrivi il tuo adattatore RecyclerView. All'interno di questa classe, scrivi una classe statica che carica tutte le TextView e altri elementi all'interno di ciascuna scheda (una carta è essenzialmente una voce di elenco). In questo modo, tutti i tuoi articoli vengono caricati su OnCreate e non vengono generati continuamente. Questo è particolarmente utile se usi i frammenti. Questo collegamento può essere utile a voi: http://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156

Ecco un esempio di una classe di adattatori RecyclerView con la classe statica:

public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> { 

    private List<ContactInfo> contactList; 

    public ContactAdapter(List<ContactInfo> contactList) { 
      this.contactList = contactList; 
    } 

    @Override 
    public int getItemCount() { 
      return contactList.size(); 
    } 

    @Override 
    public void onBindViewHolder(ContactViewHolder contactViewHolder, int i) { 
     ContactInfo ci = contactList.get(i); 
     contactViewHolder.vName.setText(ci.name); 
     contactViewHolder.vSurname.setText(ci.surname); 
     contactViewHolder.vEmail.setText(ci.email); 
     contactViewHolder.vTitle.setText(ci.name + " " + ci.surname); 
    } 

    @Override 
    public ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View itemView = LayoutInflater. 
        from(viewGroup.getContext()). 
        inflate(R.layout.card_layout, viewGroup, false); 

     return new ContactViewHolder(itemView); 
    } 


    //Static class that loads all card item components 

    public static class ContactViewHolder extends RecyclerView.ViewHolder { 
    protected TextView vName; 
    protected TextView vSurname; 
    protected TextView vEmail; 
    protected TextView vTitle; 

    public ContactViewHolder(View v) { 
      super(v); 
      vName = (TextView) v.findViewById(R.id.txtName); 
      vSurname = (TextView) v.findViewById(R.id.txtSurname); 
      vEmail = (TextView) v.findViewById(R.id.txtEmail); 
      vTitle = (TextView) v.findViewById(R.id.title); 
     } 
} 
} 
Problemi correlati