0

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

在我的聊天消息活动中,我有一个显示所有文本消息的 ListView。

在每条短信中,我都有一个 TextView,默认情况下会写入"Sending...",我希望在发送消息后对其进行更新。

在每个 ChatMessage 对象中,我都有一个sentandtime属性。如果发送为真,我将在 TextView 中显示时间,如果为假,我将按"Sending"上述方式编写。

当我发送一条新消息时,我正在向 ListView 适配器添加一个新视图,并且由于某种原因它显示该消息已发送,尽管它没有......无法真正理解为什么。

这是我的 ArrayAdapter 的 getView() 和持有者类:

@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 布尔标志写时间或“正在发送......”......

4

1 回答 1

1

这是因为 ListView 回收了以前的视图(这就是convertView变量)。可能它正在回收另一个已设置为“已发送”的视图,并且您永远不会处理chatMessagerHolder.isSent错误的替代情况。chatMessageHolder.isSent = chatMessage.isSent();在第一个 if-else 块之后,您应该避免设置。第一个 if-else 应该只是初始化视图或回收对象。此外,当您检查时,您if(chatMessageHolder.isSent)还应该处理TextView如果那是错误的应该说什么(即在后续的 else 语句中),因为视图被回收了。

于 2012-08-20T13:25:59.960 回答