android聊天ListView getView更新

时间:2012-08-20 13:09:18

标签: android listview

我已经构建了一个聊天应用程序。

在我的聊天消息Activity中,我有一个ListView,显示所有短信。

在每条短信内我都有一个TextView,默认情况下会写"Sending...",我希望在发送短信后更新。

在每个ChatMessage对象中,我有senttime属性。如果发送是真的,我将在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布尔标志来写时间或“发送...”...

1 个答案:

答案 0 :(得分:1)

这是因为ListView回收了以前的视图(convertView变量是什么)。可能它会回收另一个已经设置为&#34;已发送&#34;的视图,并且您永远不会处理chatMessagerHolder.isSent为假的备用情况。您应该避免在第一个if-else块之后设置chatMessageHolder.isSent = chatMessage.isSent();。首先,if-else应该只是初始化视图或回收对象。此外,当您检查if(chatMessageHolder.isSent)时,如果错误(即在后续的其他声明中),您还应该处理TextView应该说的内容,因为视图已被回收。