我已经构建了一个聊天应用程序。
在我的聊天消息Activity中,我有一个ListView,显示所有短信。
在每条短信内我都有一个TextView,默认情况下会写"Sending..."
,我希望在发送短信后更新。
在每个ChatMessage对象中,我有sent
和time
属性。如果发送是真的,我将在TextView中显示时间,如果它是假的,我将写上面写的"Sending"
。
当我发送新消息时,我正在向ListView适配器添加一个新视图,并且由于某种原因它显示消息已发送,尽管它没有...但是不能理解为什么。< / p>
这是我的ArrayAdapter的getView()和holder类:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ChatMessage chatMessage = chatMessagesArrayList.get(position);
ChatMessageHolder chatMessageHolder = null;
if (row == null)
{
if (chatMessage.getSenderId() == app.getFacebookCurrentUser().getId())
row = LayoutInflater.from(context).inflate(layoutResourceId, null);
else
row = LayoutInflater.from(context).inflate(R.layout.chat_green, null);
chatMessageHolder = new ChatMessageHolder();
chatMessageHolder.message = (TextView) row.findViewById(R.activity_chat.message);
chatMessageHolder.sentTime = (TextView) row.findViewById(R.activity_chat.sent_time);
chatMessageHolder.isSent = chatMessage.isSent();
row.setTag(chatMessageHolder);
}
else
{
chatMessageHolder = (ChatMessageHolder) row.getTag();
}
chatMessageHolder.message.setText(chatMessage.getMessage());
if (chatMessageHolder.isSent)
chatMessageHolder.sentTime.setText(app.getDateTime(chatMessage.getTime()));
return row;
}
private static class ChatMessageHolder
{
TextView message, sentTime;
boolean isSent = false;
}
我真的不明白为什么不根据isSent布尔标志来写时间或“发送...”...
答案 0 :(得分:1)
这是因为ListView回收了以前的视图(convertView
变量是什么)。可能它会回收另一个已经设置为&#34;已发送&#34;的视图,并且您永远不会处理chatMessagerHolder.isSent
为假的备用情况。您应该避免在第一个if-else块之后设置chatMessageHolder.isSent = chatMessage.isSent();
。首先,if-else应该只是初始化视图或回收对象。此外,当您检查if(chatMessageHolder.isSent)
时,如果错误(即在后续的其他声明中),您还应该处理TextView
应该说的内容,因为视图已被回收。