我的ListView
有一个TextView
,每个TextView
有几个项目,每个项目都有简要说明。为了对项目和描述应用不同的样式,我使用的是多个跨度对象:ClickableSpan
,ForegroundColorSpan
,BackgroundColorSpan
,AbsoluteSizeSpan
和StyleSpan
。
平均而言ListView
有10 TextView
s,每个TextView
有10对项目/描述,每对使用大约6 SpanObject
s所以总共每SpanObject
约600 ListView
s。当用户点击其中一个项目时,ListView
会被清除并重新重绘,从而生成另一组600 SpanObject
。
所以我想知道为每个项目和每个描述创建一个TextView
并通过XML格式化它而不是使用span设置TextView
样式是更好的主意,这样就可以了大概是200 TextView
s而不是SpanObject
s。
作为一个注释,我没有从这种方法开始,因为视图的层次结构树将变得更加复杂,TextView
s创建SpanObject
的成本更高,但现在我看到我正在创建的SpanObject
的数量我不确定什么是更好的。我也在考虑开始编写一个回收机制,但不确定它是否值得,或者这不应该是Android GC的问题。
答案 0 :(得分: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);
}
}
}