2012-04-11 15 views
9

Tengo un ListView que tiene un TextView y en cada TextView varios artículos, cada uno con una breve descripción. Con el fin de aplicar diferentes estilos a los elementos y la descripción, estoy utilizando múltiples objetos span: ClickableSpan, ForegroundColorSpan, BackgroundColorSpan, AbsoluteSizeSpan y StyleSpan.¿Es mejor usar múltiples SpanObjects o múltiples TextViews en Android?

En promedio, el ListView tiene 10 TextView s, y cada TextView tiene 10 pares de artículo/descripción y cada par utiliza alrededor de 6 SpanObject s así un total de ~ 600 SpanObject s por ListView. Y cuando el usuario hace clic en uno de los elementos, se borra el ListView y se vuelve a dibujar, generando otro conjunto de 600 SpanObject s.

Así que me pregunto si sería una mejor idea de crear una TextView para cada elemento y cada descripción y darle formato a través de XML en lugar de labrar las TextView s con el palmo, de esta manera no sería de alrededor de 200 TextView s y no hay SpanObject s.

Como nota, no empecé con este enfoque porque el árbol de jerarquía de puntos de vista iba a ser más complejo y TextView s son más caros de crear que los SpanObject s, pero ahora que veo el número de SpanObject s I Estoy creando No estoy seguro de qué es mejor. También estoy pensando en comenzar a escribir un mecanismo de reciclaje, pero no estoy seguro si vale la pena o esto no debería ser un problema para Android GC.

Respuesta

1

Sé que hace un par de años que hace esta pregunta, y espero que ya haya encontrado una respuesta, pero creo que respondería a su pregunta de todos modos.

La cantidad de TextViews y SpanObjects que tiene son increíblemente caros para cualquier dispositivo Android, y cargarlos cada vez no solo puede causar un retraso, sino posiblemente un bloqueo relacionado con OOM (sin memoria).

El enfoque para resolver esto es usar RecyclerView y CardView. Primero, escribe tu adaptador RecyclerView. Dentro de esta clase, escriba una clase estática que cargue todos los TextViews y otros elementos dentro de cada tarjeta (una tarjeta es esencialmente un elemento de la lista). De esta forma, todos sus artículos se cargan en OnCreate y no se generan continuamente. Esto es especialmente útil si está usando fragmentos. Este enlace puede ser de utilidad para usted: http://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156

Aquí es un ejemplo de una clase adaptador RecyclerView con la clase estática:

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); 
     } 
} 
} 
Cuestiones relacionadas