在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();
}