0

私はチャットアプリケーションを構築しました。

チャット メッセージ アクティビティ内に、すべてのテキスト メッセージを表示する ListView があります。

各テキストメッセージ内には、デフォルトで書き込みを行う TextView があり"Sending..."、メッセージの送信後に更新したいと考えています。

各 ChatMessage オブジェクト内にsentandtimeプロパティがあります。送信が true の場合は TextView に時間を表示し、false の場合は"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すでに「送信済み」に設定されている別のビューをリサイクルしている可能性があり、falseの別のケースを処理することはありません。chatMessageHolder.isSent = chatMessage.isSent();その最初のif-elseブロックが終わるまで設定を避ける必要があります。その最初のif-elseは、ビューを初期化するか、オブジェクトをリサイクルするだけです。また、チェックするときは、ビューが再利用されるため、それが誤りである場合(つまり、フォローアップelseステートメントで)に言うif(chatMessageHolder.isSent)べきことも処理する必要があります。TextView

于 2012-08-20T13:25:59.960 に答える