在Android中,如何防止更新notifyDataSetChanged()上的现有项

在Android中,如何防止更新notifyDataSetChanged()上的现有项,android,android-arrayadapter,Android,Android Arrayadapter,我有一个聊天应用程序 在自定义阵列适配器中。我使用以下代码为每条消息的用户名设置随机颜色: String[] array = context.getResources().getStringArray(R.array.username_colors); randomColor = array[new Random().nextInt(array.length)]; nameTextView.setTextColor(Color.parseColor(randomColor)); 当新消息到达时

我有一个聊天应用程序 在自定义阵列适配器中。我使用以下代码为每条消息的用户名设置随机颜色:

String[] array = context.getResources().getStringArray(R.array.username_colors);
randomColor = array[new Random().nextInt(array.length)];
nameTextView.setTextColor(Color.parseColor(randomColor));
当新消息到达时,我将其添加到listview,并调用adapter.notifyDataSetChanged(); 这会导致每次重新存储消息中的现有用户名。 调用adapter.notifyDataSetChanged()时,如何防止重新存储listview中的现有项

编辑1

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ChatMessageElement el = list.get(position);
        ViewHolder holder = null;
        NewMessagesLabelHolder labelHolder = null;

        if (convertView == null) {
            convertView = el.getView(inflater, parent);

            if (el.isMessage()) {

                holder = new ViewHolder();
                holder.messageLayout = (RelativeLayout) convertView.findViewById(R.id.message_container);
                holder.messageContent = (LinearLayout) convertView.findViewById(R.id.message_content);
                holder.bottomIndicator = (LinearLayout) convertView.findViewById(R.id.bottom_indicators);
                holder.dateTextView = (TextView) convertView.findViewById(R.id.message_date);
                holder.timeAgo = (TextView) convertView.findViewById(R.id.time_ago);
                holder.nameTextView = (TextView) convertView.findViewById(R.id.user_name);
                holder.likesCountTextView = (TextView) convertView.findViewById(R.id.likes_count);
                holder.likesLabelImageView = (ImageView) convertView.findViewById(R.id.likes_label);
                holder.spamCountTextView = (TextView) convertView.findViewById(R.id.spam_count);
                holder.spamLabelImageView = (ImageView) convertView.findViewById(R.id.spam_label);
                holder.avatarImageView = (ImageView) convertView.findViewById(R.id.avatar);
                holder.statusImageView = (ImageView) convertView.findViewById(R.id.delivered_label);
                holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progress_bar);
                holder.errorSign = (ImageView) convertView.findViewById(R.id.error_sign);
                holder.spamSign = (ImageView) convertView.findViewById(R.id.spam_sign);
                holder.bookmarkLabel = (ImageView) convertView.findViewById(R.id.bookmark_label);
                holder.topIndicators = (LinearLayout) convertView.findViewById(R.id.topIndicators);
                convertView.setTag(holder);
            }
            if (el.isNewMessagesLabel()) {
                convertView = inflater.inflate(R.layout.chat_new_messages_label_layout, parent, false);

                labelHolder = new NewMessagesLabelHolder();
                labelHolder.newMessagesLabel = (TextView) convertView.findViewById(R.id.new_messages_label);
                convertView.setTag(labelHolder);
            }
        } else {
            if (el.isMessage()) {
                holder = (ViewHolder) convertView.getTag();
            }
            if (el.isNewMessagesLabel()) {
                labelHolder = (NewMessagesLabelHolder) convertView.getTag();
            }
        }

        if (el.isMessage()) {
            Message currentMessage = (Message) el;
            drawMessage(holder, currentMessage, position);
        }
        if (el.isNewMessagesLabel()) {
            NewMessagesLabel messagesLabel = (NewMessagesLabel) el;
            drawNewMessagesLabel(labelHolder, messagesLabel);
        }

        return convertView;
    }



private void drawMessage(ViewHolder holder, Message message, int position) {
        String date = message.getCreatedAt();
        String formattedDate = DateHelper.getInstance(context).formatDate("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "HH:mm", date);

        String userName = message.getUserName();

        holder.likesLabelImageView.setVisibility(View.GONE);
        holder.likesCountTextView.setVisibility(View.GONE);
        holder.spamCountTextView.setVisibility(View.GONE);
        holder.spamLabelImageView.setVisibility(View.GONE);
        holder.bookmarkLabel.setVisibility(View.GONE);
        holder.statusImageView.setVisibility(View.GONE);
        holder.progressBar.setVisibility(View.GONE);
        holder.statusImageView.setVisibility(View.GONE);
        holder.errorSign.setVisibility(View.GONE);
        holder.spamSign.setVisibility(View.GONE);
        holder.timeAgo.setVisibility(View.GONE);
        holder.timeAgo.setText("");
        holder.messageLayout.setAlpha(1f);
        holder.topIndicators.setVisibility(View.VISIBLE);

        if (message.isNewDay()) {
            holder.timeAgo.setVisibility(View.VISIBLE);
            String dayDate = DateHelper.getInstance(context).formatDate("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "MMMM d, yyyy", date);
            //String dayDate = getTimeAgo(mHelper.millisFromString(message.getCreatedAt()), context);
            holder.timeAgo.setText(dayDate);
        }else{
            holder.timeAgo.setVisibility(View.GONE);
        }

        holder.avatarImageView.setImageResource(R.drawable.com_facebook_profile_default_icon);

        if (GrouviDatabaseManager.getInstance(context).getCurrentUser().getId() == message.getUserId()) {
            userName = USERNAME_ME;


            if (message.getStatus() != null && message.getStatus().equals(Message.MSG_STATUS_SEND)) {
                holder.statusImageView.setBackgroundResource(R.drawable.icon_chat_message_delivered);
                holder.statusImageView.setVisibility(View.VISIBLE);
            }
            if (message.getStatus() != null && message.getStatus().equals(Message.MSG_STATUS_SENDING)) {
                holder.progressBar.setVisibility(View.VISIBLE);
            }
            if (message.getStatus() != null && message.getStatus().equals(Message.MSG_STATUS_LOCAL)) {
                holder.statusImageView.setBackgroundResource(R.drawable.icon_chat_message_delivered);
                holder.statusImageView.setVisibility(View.VISIBLE);
            }
            if (message.getStatus() == null || message.getStatus().equals(Message.MSG_STATUS_ERROR)) {
                holder.messageLayout.setAlpha(0.4f);
                holder.errorSign.setVisibility(View.VISIBLE);
            }
        }


        if (message.getSpamCount() > 0 && currentMode == MODE_NORMAL) {
            holder.messageLayout.setAlpha(0.4f);
            holder.spamSign.setVisibility(View.VISIBLE);
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            holder.messageContent.setLayoutParams(params);

            holder.spamCountTextView.setText(Integer.toString(message.getSpamCount()));
            holder.spamCountTextView.setVisibility(View.VISIBLE);
            holder.spamLabelImageView.setVisibility(View.VISIBLE);
        } else {
            holder.messageLayout.setAlpha(1f);
            holder.spamSign.setVisibility(View.GONE);
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
            holder.messageContent.setLayoutParams(params);
        }

        if (currentMode == MODE_REPORT) {
            String timeAgo = getTimeAgo(mHelper.millisFromString(message.getCreatedAt()));
            holder.timeAgo.setText(timeAgo);
            holder.timeAgo.setVisibility(View.VISIBLE);
        }

        if (message.getUserAvatar() != null && !message.getUserAvatar().isEmpty()) {
            try {
                Picasso
                        .with(context)
                        .load(message.getUserAvatar())
                        .error(R.drawable.com_facebook_profile_default_icon)
                        .placeholder(R.drawable.com_facebook_profile_default_icon)
                        .into(holder.avatarImageView);
            } catch (Exception e) {
                Log.e("Main", e.getMessage(), e);
            }
        }
        colorUsername(holder, message, userName);
        holder.nameTextView.setText(userName);
        holder.dateTextView.setText(formattedDate);

        if (message.getLikesCount()>0) {
            holder.likesCountTextView.setText(Integer.toString(message.getLikesCount()));
            holder.likesCountTextView.setVisibility(View.VISIBLE);
            holder.likesLabelImageView.setVisibility(View.VISIBLE);
        }

        if (message.isBookmarked()) {
            holder.bookmarkLabel.setVisibility(View.VISIBLE);
        }

        List<MessageComponent> messageComponentList;
        messageComponentList = message.getMessageComponents();

        drawMessageContent(holder, messageComponentList, message);

        holder.nameTextView.setTag(position);
        holder.avatarImageView.setTag(position);
        holder.nameTextView.setOnClickListener(userClickListener);
        holder.avatarImageView.setOnClickListener(userClickListener);

        // hang empty onLingClickListener to display context menu when
        // long click on whole message
        holder.nameTextView.setOnLongClickListener(longClickListener);
        holder.avatarImageView.setOnLongClickListener(longClickListener);
    }

private void colorUsername(ViewHolder holder, Message message, String userName) {
        String randomColor = prevColor;
        if (userName.equals(USERNAME_ME)){
            randomColor = "#000000";
        }else if (message.getUserId()!=prevMsgUserID) {
            do {
                String[] array = context.getResources().getStringArray(R.array.username_colors);
                randomColor = array[new Random().nextInt(array.length)];
            }while (prevColor.equals(randomColor));

        }
        holder.nameTextView.setTextColor(Color.parseColor(randomColor));
        prevColor = randomColor;
        prevMsgUserID = message.getUserId();
    }
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
ChatMessageElement el=list.get(位置);
ViewHolder=null;
NewMessagesLabelHolder-labelHolder=null;
if(convertView==null){
convertView=el.getView(充气机,父级);
if(el.isMessage()){
holder=新的ViewHolder();
holder.messageLayout=(RelativeLayout)convertView.findViewById(R.id.message\u容器);
holder.messageContent=(LinearLayout)convertView.findViewById(R.id.message\u content);
holder.bottomIndicator=(LinearLayout)convertView.findViewById(R.id.bottom_indicators);
holder.dateTextView=(TextView)convertView.findViewById(R.id.message\u date);
holder.timeAgo=(TextView)convertView.findViewById(R.id.time\u ago);
holder.nameTextView=(TextView)convertView.findViewById(R.id.user\u name);
holder.likeCountTextView=(TextView)convertView.findViewById(R.id.likes\u count);
holder.likesLabelImageView=(ImageView)convertView.findViewById(R.id.likes\u标签);
holder.spamCountTextView=(TextView)convertView.findViewById(R.id.spam\u计数);
holder.spamLabelImageView=(ImageView)convertView.findViewById(R.id.spam\u标签);
holder.avatarImageView=(ImageView)convertView.findViewById(R.id.avatar);
holder.statusImageView=(ImageView)convertView.findViewById(R.id.U标签);
holder.progressBar=(progressBar)convertView.findViewById(R.id.progress\u bar);
holder.errorSign=(ImageView)convertView.findViewById(R.id.error\u符号);
holder.spamSign=(ImageView)convertView.findViewById(R.id.spam\u符号);
holder.bookmarkLabel=(ImageView)convertView.findViewById(R.id.bookmark\u标签);
holder.topIndicators=(LinearLayout)convertView.findViewById(R.id.topIndicators);
convertView.setTag(支架);
}
if(el.isNewMessagesLabel()){
convertView=充气机。充气(R.layout.chat\u new\u messages\u label\u layout,parent,false);
labelHolder=NewMessagesLabelHolder();
labelHolder.newMessagesLabel=(TextView)convertView.findViewById(R.id.new\u messages\u label);
convertView.setTag(标签架);
}
}否则{
if(el.isMessage()){
holder=(ViewHolder)convertView.getTag();
}
if(el.isNewMessagesLabel()){
labelHolder=(NewMessagesLabelHolder)convertView.getTag();
}
}
if(el.isMessage()){
消息当前消息=(消息)el;
drawMessage(保持架、当前消息、位置);
}
if(el.isNewMessagesLabel()){
NewMessagesLabel messagesLabel=(NewMessagesLabel)el;
drawNewMessagesLabel(标签架,messagesLabel);
}
返回视图;
}
私有无效消息(视图持有者、消息消息、内部位置){
字符串日期=message.getCreatedAt();
字符串formattedDate=DateHelper.getInstance(context).formattate(“yyyy-MM-dd'T'HH:MM:ss.SSS'Z'”,“HH:MM”,date);
字符串userName=message.getUserName();
holder.likesLabelImageView.setVisibility(View.GONE);
holder.likeCountTextView.setVisibility(View.GONE);
holder.spamCountTextView.setVisibility(View.GONE);
holder.spamLabelImageView.setVisibility(View.GONE);
holder.bookmarkLabel.setVisibility(View.GONE);
holder.statusImageView.setVisibility(View.GONE);
holder.progressBar.setVisibility(View.GONE);
holder.statusImageView.setVisibility(View.GONE);
holder.errorSign.setVisibility(View.GONE);
holder.spamSign.setVisibility(View.GONE);
holder.timeAgo.setVisibility(View.GONE);
holder.timeAgo.setText(“”);
holder.messageLayout.setAlpha(1f);
支架.顶部指示器.设置可见性(视图.可见);
if(message.isNewDay()){
holder.timeAgo.setVisibility(View.VISIBLE);
字符串dayDate=DateHelper.getInstance(context).formatDate(“yyyy-MM-dd'T'HH:MM:ss.SSS'Z'”,“MMMM-d,yyyy”,date);
//String dayDate=getTimeAgo(mHelper.millisFromString(message.getCreatedAt()),上下文);
holder.timeAgo.setText(dayDate);
}否则{
holder.timeAgo.setVisibility(View.GONE);
}
holder.avatarImageView.setImageResource(R.drawable.com\u facebook\u profile\u default\u图标);
if(GrouviDatabaseManager.getInstance(context).getCurrentUser().getId()==message.getUserId()){
userName=userName\u ME;
if(message.getStatus()!=null&&message.getStatus().equals(message.MSG\u STATUS\u SEND)){
holder.statusImageView.setBackgroundResource(R.drawable.icon\u chat\u message\u delivered);
holder.statusImageView.setVisibility(View.VISIBLE);
}
if(message.getStatus()!=null&&message.getStatus().equals(message.MSG\u STATUS\u SENDING)){
holder.progressBar.setVisibility(视图可见);
}
if(message.getStatus()!=null&&message.getStatus().equals(message.MSG\u STATUS\u LOCAL)){
holder.statusImageView.setBackgroundResource(R.drawable.icon\u chat\u message\u delivered);
    private Map<Message, String> colorsMap = new HashMap<Message, String>();

private void colorUsername(ViewHolder holder, Message message, String userName) {
    String randomColor;
    if(colorsMap.contains(message)) {
        randomColor = colorsMap.get(message);
    }
    else {
        if (userName.equals(USERNAME_ME)){
            randomColor = "#000000";
        }else if (message.getUserId()!=prevMsgUserID) {
            do {
                String[] array = context.getResources().getStringArray(R.array.username_colors);
                randomColor = array[new Random().nextInt(array.length)];
            }while (prevColor.equals(randomColor));

        }
        colorsMap.put(message, randomColor);
    }        
    holder.nameTextView.setTextColor(Color.parseColor(randomColor));
}
Like ArrayList<UserModel> arr = new ArrayList<UserModel>();
{

UserModel model = arr.get(position);

String color = user.getUserColor();

}