【问题标题】:Is it better to use multiple SpanObjects or multiple TextViews in Android?在 Android 中使用多个 SpanObject 或多个 TextView 更好吗?
【发布时间】:2012-04-11 16:04:42
【问题描述】:

我有一个ListView,其中有一个TextView,每个TextView 有几个项目,每个项目都有简要说明。为了对项目和描述应用不同的样式,我使用了多个 span 对象:ClickableSpanForegroundColorSpanBackgroundColorSpanAbsoluteSizeSpanStyleSpan

平均而言,ListView 有 10 个 TextViews,每个 TextView 有 10 对项目/描述,每对使用大约 6 个 SpanObjects,因此每个 @ 总共有 ~600 个SpanObjects 987654334@。当用户点击其中一个项目时,ListView 被清除并再次重绘,生成另一组 600 个SpanObjects。

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

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

【问题讨论】:

    标签: android performance garbage-collection textview


    【解决方案1】:

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

    对于任何 android 设备,您拥有的 TextView 和 SpanObject 的数量都非常昂贵,并且每次加载它们不仅会导致延迟,而且可能会导致与 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);
          }
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      相关资源
      最近更新 更多