2013-08-26 60 views
0

我创建一些ViewHolders为我的项目的ListViews,在视图内我存储视图,ImageViews,TextViews和更多。Android性能问题与ViewHolder

在viewholder的课我还创建方法来配置从项目的状态,IE的观点:

对于聊天消息列表项,我将有一个viewholder与消息的发送者,一个ImageView的一个TextView用他的头像,一个包含来自应用程序资源的图像的图像视图,以将该消息标识为音频消息,视频消息,文本消息等等。 在同一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中只保留严格要求的字段和没有方法吗?
+3

请显示您的自定义适配器 –

回答

2

如你所知,ViewHolder用于优化ListView像储蓄已经创建的视图-s性能和滚动你正在做这个观点后,改变它的图像或文字或任何查看您拥有并把它作为回另一个ListItem。所以你避免每次使用findViewById()并创建新的视图。

在我看来,如果你在ViewHolder中加入了一些方法,除非这些方法编写得不好,否则不应该对ListViews造成任何性能问题。只要您避免创建新视图,并且每次都使用findViewById()就可以。