ViewHolder的Android性能问题

时间:2013-08-26 12:16:04

标签: android performance listview

我正在为我的项目的ListView创建一些ViewHolders,在视图中我存储视图,ImageViews,TextViews等。

在viewholder的类中,我还创建了从项目状态配置视图的方法,I.E:

对于聊天消息列表项,我将拥有一个视图,其中包含消息发送者的textview,带有他头像的imageview,一个包含来自App资源的图像的图像视图,用于将消息标识为音频消息,视频消息,短信等。 在同一个ViewHolder中,我也有类似的方法:

configureViewFromMessage(MessageSender sender, Message message)

用于配置发件人和邮件POJO模型中的头像,发件人姓名和邮件类型。

修改 我正在添加一个示例适配器来更好地解释这一点。

public View getView(int position, View convertView, ViewGroup viewGroup) {
    ContactViewHolder cvh;

    if (convertView != null) {
        cvh = (ContactViewHolder) convertView.getTag();
    } else {
        convertView = InflateUtils.inflate(mContext, R.layout.contact_list_item);
        convertView = InflateUtils.inflate(mContext, R.layout.contact_list_item_container);
        cvh = new ContactViewHolder(innerView);
        convertView.setTag(cvh);
    }

    /* Getting message */
    Message message = getItem(position);
    MessageSender sender = message.getSender();

    /* View settings */
    cvh.configureViewFromMessage(sender, message, mContext);
        /* Context is used to reach App's Resources */

    return convertView;
}

问题是:

  1. 在ViewHolder中使用这些方法(可能很多)会导致性能问题吗?
  2. 我应该只在严格要求的字段和方法中保留ViewHolders吗?

1 个答案:

答案 0 :(得分:2)

如您所知,ViewHolder用于优化ListView的性能,例如保存已创建的视图,滚动后您正在使用此视图,更改其图像或文本或您拥有的任何视图把它作为另一个ListItem。因此,您不必每次都使用findViewById()并创建新视图。

在我看来,如果你在ViewHolder中添加一些方法,它不应该导致ListViews出现任何性能问题,除非这些方法写得不好。只要您每次都避免创建新视图并使用findViewById()就可以了。