列表视图中的项目使用持有人混淆

时间:2013-07-11 08:08:41

标签: android android-listview android-adapter

我对BaseAdapter有一个简单列表视图的问题。 我想在getView方法中使用holder来在列表视图中获得更好的性能。 但是当我使用支架时,物品会混淆。列表视图中的项目数量是正确的,但顺序错误。 提前致谢。 这是我在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;

2 个答案:

答案 0 :(得分:0)

你错过了viewHolder模式的用法。出于效率原因,我们认为这是为了避免滚动时findViewById操作。必须始终完成集合*操作。鉴于您的实现,您应该始终看到相同的值(第一个)

答案 1 :(得分:0)

仅使用getView回收视图,在这种情况下应重置属性。可以重用像TextView等Ui元素,但即使convertview不为null,也应该重置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;