0

我对简单列表视图的 BaseAdapter 有疑问。我想在 getView 方法中使用一个持有者来在列表视图中获得更好的性能。但是当我使用支架时,所有物品都混在一起了。列表视图中的项目数量是正确的,但顺序是错误的。提前致谢。这是我在 getView 中的代码:

    ChatRowView holder;
    ChatActivity.chatObject currentChatObject = getItem(position);
    if(convertView == null)
    {
        holder = new ChatRowView();
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_row, null);
        holder.chatComponent = new ChatComponent(mContext, currentChatObject.isLeft, currentChatObject.extraType, currentChatObject.message);           

        holder.chatComponent.tvName.setText(currentChatObject.name);
        holder.chatComponent.tvTime.setText(currentChatObject.time);
        load("some picture", holder.chatComponent.ivUser);

        if(currentChatObject.extraType != ExtraContentView.eChatExtraContentType.NONE)
        {
            if(currentChatObject.extraType != ExtraContentView.eChatExtraContentType.GAME)
            {
                App.loadImage(teamsBaseUrl + "132" + "_70x70.png", holder.chatComponent.extraContentView.ivTeamLogo);
            }
            else
            {
                App.loadImage(teamsBaseUrl + "132" + "_70x70.png", holder.chatComponent.extraContentView.ivHomeTeamLogo);
                App.loadImage(teamsBaseUrl + "132" + "_70x70.png", holder.chatComponent.extraContentView.ivAwayTeamLogo);
            }
        }
        ((RelativeLayout)convertView).addView(holder.chatComponent);        
        convertView.setTag(holder);

        extraButtonsListener(holder.chatComponent);
    }
    else
    {
        holder = (ChatRowView)convertView.getTag();
    }                   
    return convertView;
4

2 回答 2

0

仅使用 getView 回收视图,在这种情况下应重置属性。可以重复使用 TextView 等 Ui 元素,但即使 convertview 不为空,也应重置 textview 中的文本。尝试下面列出的更改

  ChatRowView holder;
ChatActivity.chatObject currentChatObject = getItem(position);
if(convertView == null)
{

    convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_row, null);

}


holder = new ChatRowView();  

   holder.chatComponent = new ChatComponent(mContext, currentChatObject.isLeft,        currentChatObject.extraType, currentChatObject.message);           

    holder.chatComponent.tvName.setText(currentChatObject.name);
    holder.chatComponent.tvTime.setText(currentChatObject.time);
    load("some picture", holder.chatComponent.ivUser);

    if(currentChatObject.extraType != ExtraContentView.eChatExtraContentType.NONE)
    {
        if(currentChatObject.extraType != ExtraContentView.eChatExtraContentType.GAME)
        {
            App.loadImage(teamsBaseUrl + "132" + "_70x70.png", holder.chatComponent.extraContentView.ivTeamLogo);
        }
        else
        {
            App.loadImage(teamsBaseUrl + "132" + "_70x70.png", holder.chatComponent.extraContentView.ivHomeTeamLogo);
            App.loadImage(teamsBaseUrl + "132" + "_70x70.png", holder.chatComponent.extraContentView.ivAwayTeamLogo);
        }
    }
    ((RelativeLayout)convertView).addView(holder.chatComponent);        
    convertView.setTag(holder);

    extraButtonsListener(holder.chatComponent);

return convertView;
于 2013-07-11T08:22:40.853 回答
0

你误解了viewHolder模式的用法。出于效率原因,这是为了避免findViewById每次滚动时的操作。必须始终执行 set* 操作。鉴于您的实现,您应该始终看到相同的值(第一个)

于 2013-07-11T08:12:06.903 回答