在Android中,使用多个SpanObjects还是多个TextViews更好?

9
我有一个包含TextView的ListView,在每个TextView中有多个项目,每个项目都有简短的描述。为了对项目和描述应用不同的样式,我使用了多个span对象:ClickableSpan,ForegroundColorSpan,BackgroundColorSpan,AbsoluteSizeSpan和StyleSpan。
平均每个ListView有10个TextView,每个TextView有10对项目和描述,每个对使用约6个SpanObject,因此每个ListView总共有约600个SpanObject。当用户点击其中一个项目时,ListView会被清除并重新绘制,生成另一组600个SpanObject。
所以我想知道是否创建每个项目和描述的一个TextView,并通过XML格式化它们比使用span样式化TextView更好。这样就会有大约200个TextView,而没有SpanObject。
需要注意的是,我没有从这个角度出发,因为视图的层次树将变得更加复杂,而创建TextView的成本比创建SpanObject更高,但现在我看到我正在创建的SpanObject数量,我不确定哪种方法更好。我还在考虑开始编写回收机制,但不确定它是否值得或者这应该不是Android GC的问题。
1个回答

1

我知道你提出这个问题已经过去几年了,希望你现在已经找到答案了,但是我还是想回答你的问题。

任何Android设备都无法承受你拥有的TextView和SpanObjects的数量,每次加载它们不仅会导致延迟,而且可能会引起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);
      }
 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接