2012-04-11 13 views
9

TextView ve her TextView öğesinde, her biri kısa bir açıklama içeren bir ListView var. Öğelere ve açıklamalara farklı stiller uygulamak için, çoklu harfler yayma nesneleri kullanıyorum: ClickableSpan, ForegroundColorSpan, BackgroundColorSpan, AbsoluteSizeSpan ve StyleSpan.Android'de birden çok SpanObject veya birden çok TextView kullanmak daha iyi midir?

Ortalama s vardır ve her TextView madde/açıklama 10 çift yer alır ve her bir çift, yaklaşık 6 SpanObject kullanır, böylece ListView başına ~ 600 SpanObject s toplam s. Kullanıcı öğelerin birini tıklattığında ListView temizlenir ve yeniden başka bir 600 SpanObject s kümesi oluşturur.

Bu yüzden daha iyi bir fikir her öğe ve her açıklama için bir tane TextView oluşturmak ve yayılma ile TextView s stil daha XML aracılığıyla yerine biçimlendirmek olurdu, bu yolu var yaklaşık 200 TextView ler olmalı ve olacaktır merak ediyorum SpanObject s.

Bir not olarak

, görüş hiyerarşi ağacı daha karmaşık olacaktı çünkü bu yaklaşım ile başlamadı ve TextView s oluşturmak için daha pahalıdır SpanObject s olduğunu ama şimdi SpanObject s I numarasını görürler Ben daha iyi ne olduğundan emin değilim. Ayrıca bir geri dönüşüm mekanizması yazmaya başladığımı düşünüyorum, ancak değerinin olup olmadığından emin değilim ya da bu Android GC için bir sorun olmamalı.

cevap

1

Bu soruyu sormanızın üzerinden birkaç yıl geçtiğini biliyorum ve umarım şimdiye kadar bir cevap bulmuşsunuzdur, ancak sorunuzu yanıtlayacağımı düşündüm.

Sahip olduğunuz TextViews ve SpanObjects miktarı, herhangi bir android cihaz için inanılmaz derecede pahalıdır ve her defasında yüklenmesi yalnızca gecikmeye neden olmaz, ancak muhtemelen OOM ile ilgili bir kilitlenme (bellek yetersiz) olabilir.

Bunu çözme yaklaşımı bir RecyclerView ve CardView kullanıyor. Öncelikle, RecyclerView adaptörünüzü yazın. Bu sınıf içinde, tüm kartların içindeki tüm TextView'ları ve diğer öğeleri yükleyen bir statik sınıf yazın (bir kart aslında bir liste öğesidir). Bu şekilde, tüm öğeleriniz OnCreate'a yüklenir ve sürekli olarak oluşturulmaz. Bu, fragmanları kullanıyorsanız özellikle yararlıdır. Bu bağlantı size yararlı olabilir:

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); 
     } 
} 
} 
: Burada

http://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156 statik sınıf ile bir RecyclerView adaptör sınıfının bir örneğidir