2012-04-11 69 views
9

我有一個ListView有一個TextView和每個TextView幾個項目,每個項目都有一個簡短的說明。爲了對項目和描述應用不同的樣式,我使用了多個跨度對象:ClickableSpan,ForegroundColorSpan,BackgroundColorSpan,AbsoluteSizeSpanStyleSpan在Android中使用多個SpanObjects或多個TextViews會更好嗎?

平均的ListView具有10個TextView S,並且每個TextView具有10對項/描述和每對使用大約6 SpanObject太總共每ListView〜600 SpanObject秒。當用戶點擊其中一個項目時,ListView被清除並再次重繪,產生另一組600 SpanObject s。

所以我想知道如果這將是一個更好的主意,爲每一個項目,每介紹一個TextView並通過XML格式化而非樣式的TextView s的範圍,這樣將有大約200 TextView S和無SpanObject s。

作爲一個說明,我沒有用這種方法啓動,因爲視圖的層次樹將是更加複雜和TextView s爲創造更昂貴的SpanObject秒,但現在我看到SpanObject的I的數量我正在創造我不知道什麼更好。我也在考慮開始編寫回收機制,但不知道這是否值得,或者這對Android GC應該不是問題。

回答

1

我知道你問這個問題已經兩年了,我希望你現在已經找到了答案,但我想我會回答你的問題。

你擁有的TextViews和SpanObjects的數量對於任何Android設備來說都是非常昂貴的,每次加載它們不僅會造成延遲,而且可能會導致與OOM相關的崩潰(內存不足)。

解決此問題的方法是使用RecyclerView和CardView。首先,編寫您的RecyclerView適配器。在這個類中,編寫一個靜態類,用於加載每張卡片中的所有TextView和其他項目(一張卡片本質上是一個列表項目)。這樣,您的所有物品都將加載到OnCreate上,並且不會持續生成。如果你使用片段,這是特別有用的。 此鏈接可能是你有幫助:http://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156

下面是與靜態類RecyclerView適配器類的一個實例:

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); 
     } 
} 
} 
相關問題