9

我有一个ListView,每个都有一个TextViewTextView几个项目,每个项目都有一个简短的描述。为了对项目和描述应用不同的样式,我使用了多个 span 对象:ClickableSpanForegroundColorSpanBackgroundColorSpan和.AbsoluteSizeSpanStyleSpan

平均而言,ListView有 10TextView秒,每个TextView有 10 对项目/描述,每对使用大约 6SpanObject秒,因此总共约 600SpanObjectListView。并且当用户单击其中一个项目时,它ListView会被清除并再次重绘,从而生成另一组 600SpanObject秒。

所以我想知道TextView为每个项目和每个描述创建一个并通过 XML 格式化它是否是一个更好的主意,而不是TextView用 span 设置 s 的样式,这样大约有 200 TextViews 而没有SpanObjects。

作为说明,我没有从这种方法开始,因为视图的层次结构树会更复杂,并且TextView创建 s 的成本更高,SpanObject但是现在我看到SpanObject我正在创建的 s 的数量我不确定是什么更好。我也在考虑开始编写一个回收机制,但不确定它是否值得,或者这对 Android GC 来说应该不是问题。

4

1 回答 1

1

我知道你问这个问题已经有几年了,我希望你现在已经找到了答案,但我想无论如何我都会回答你的问题。

对于任何 android 设备,您拥有的 TextViews 和 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);
      }
 }
}
于 2015-08-11T01:48:13.753 回答