目前,我在每个孩子中都有一个带有TextView的ListView。该TextView将使用Spanned字符串进行填充。我正在使用ViewHolder模式,并且没有在getView()中解析Spanned字符串。当我从Spanned字符串切换回普通字符串时,ListView的滚动性能大大提高。我想继续使用Spanned,因为它可以即时正确格式化我的文本。

他们是否可以在保持TextViews Spanned的字符串输入的同时提高ListView的性能?

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
    final ViewHolder holder;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.comment, null);

        holder = new ViewHolder();
        holder.userName = (TextView) convertView.findViewById(R.id.comment_user_name);
        holder.date = (TextView) convertView.findViewById(R.id.comment_created_date);
        holder.body = (TextView) convertView.findViewById(R.id.comment_body);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    User user = array.get(position).getCreatedBy();
    holder.userName.setText(user.getName());
    holder.date.setText(array.get(position).getDateCreated());
    holder.body.setText(array.get(position).getBody());

    return convertView;
}

最佳答案

尽管我没有找到问题的原因,但确实找到了解决上述问题的解决方法。

调用getBody()返回一个Spanned对象,该对象在getView()的每次迭代中都导致异常数量的垃圾回收。当我将Spanned转换为String时,问题就消失了。这是我修改以解决该问题的代码。

holder.body.setText(array.get(position).getBody()**.toString()**);


尽管我仍然想找到一个确凿的理由来说明为什么会发生这种情况。

07-26 07:19