2012-04-11 19 views
9

Tôi có một ListViewTextView và trong mỗi TextView một số mục, mỗi mục có mô tả ngắn gọn. Để áp dụng các kiểu khác nhau cho các mục và mô tả Tôi đang sử dụng các đối tượng span span: ClickableSpan, ForegroundColorSpan, BackgroundColorSpan, AbsoluteSizeSpanStyleSpan.Có tốt hơn khi sử dụng nhiều SpanObject hoặc nhiều TextView trong Android?

Tính trung bình các ListView có 10 TextView s, và mỗi TextView có 10 cặp mục/mô tả và mỗi cặp sử dụng khoảng 6 SpanObject s do đó, một tổng cộng ~ 600 SpanObject s mỗi ListView. Và khi người dùng nhấp vào một trong các mục, ListView sẽ bị xóa và vẽ lại, tạo lại một bộ 600 SpanObject giây nữa. Vì vậy, tôi tự hỏi nếu nó sẽ là một ý tưởng tốt hơn để tạo ra một TextView cho mỗi mục và mỗi mô tả và định dạng nó thông qua XML hơn là tạo kiểu TextView s với span, theo cách này sẽ có khoảng 200 TextView s và không có SpanObject s. Như một lưu ý, tôi đã không bắt đầu với phương pháp này vì cây phân cấp của khung nhìn sẽ phức tạp hơn và TextView s đắt hơn để tạo ra rằng SpanObject s nhưng bây giờ tôi thấy số lượng SpanObject s tôi đang tạo ra tôi không chắc chắn những gì là tốt hơn. Tôi cũng đang nghĩ đến việc bắt đầu viết một cơ chế tái chế nhưng không chắc liệu nó có đáng hay không hay đây không phải là vấn đề đối với Android GC.

Trả lời

1

Tôi biết đã vài năm kể từ khi bạn đặt câu hỏi này, và tôi hy vọng bạn đã tìm thấy câu trả lời ngay bây giờ, nhưng tôi nghĩ tôi sẽ trả lời câu hỏi của bạn dù sao đi nữa.

Số lượng TextViews và SpanObject bạn có là cực kỳ tốn kém cho bất kỳ thiết bị Android nào và tải chúng mỗi lần không chỉ gây lag, mà có thể là sự cố liên quan đến OOM (hết bộ nhớ).

Cách tiếp cận để giải quyết vấn đề này là sử dụng RecyclerView và CardView. Trước tiên, hãy viết bộ điều hợp RecyclerView của bạn. Trong lớp này, hãy viết một lớp tĩnh tải tất cả các TextView và các mục khác trong mỗi thẻ (một thẻ về bản chất là một mục danh sách). Bằng cách này, tất cả các mục của bạn được tải trên OnCreate và không được tạo liên tục. Điều này đặc biệt hữu ích nếu bạn đang sử dụng phân đoạn. Liên kết này có thể được sử dụng cho bạn: http://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156

Dưới đây là một ví dụ về một lớp RecyclerView adapter với lớp tĩnh:

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); 
     } 
} 
} 
Các vấn đề liên quan