0

ListView問題:チャットでメッセージを表示するためにカスタムを使用しようとしています。私はArrayList自分のクラスのオブジェクトでパラメータを設定しました。コードは以下のとおりです。

問題:レイアウトが膨らむたびにメッセージテキストとタイムスタンプが常に同じままで、getView()メソッドに問題がありますが、何がわかりません。

PS ChatActivityには多くのコードが含まれています。問題をクリーンに保つために、問題に関連するものだけを投稿します。

Message.java:

 public class Message{

/*
 * 1- outgoing
 * 2-incoming
 * */

public String message;
public String timestamp;
public TextView tvmessage, tvtimestamp;
public ImageView indicator;
public int type;

public Message(String text, int type){
    this.timestamp = generateTimestamp();
    this.message = text;
    this.type=type;

    Log.d("Message", message);
    //Message text is set correctly each time the constructor is called

}

@SuppressLint("SimpleDateFormat")
public String generateTimestamp() {
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
    String ts = sdf.format(new Date());

    return ts;
}

    }

ChatActivity:

 private ArrayList<Message> OutgoingMessagesList;
 private SingleChatAdapter adapter;
  private EditText etInput;
 lv = getListView();
    adapter = new SingleChatAdapter(this, OutgoingMessagesList);
    lv.setAdapter(adapter);

public void sendMessage() {

    String tmpMessage = etInput.getText().toString().trim();
    /*--- check whether the message string is empty ---*/
    if (tmpMessage.length() > 0) {

        Message msg = new Message(tmpMessage, 1);

        OutgoingMessagesList.add(msg);

        /*
         * TODO: save the message to local database, send the message to
         * server, save it to server database and forward to the recipient
         */
        adapter.notifyDataSetChanged();
        etInput.setText("");

    } else {

        MiscUtils.gibShortToast(this, getString(R.string.msgEmpty));
    }

}

問題があると私が信じているアダプタクラスは次のとおりです。

    public final class SingleChatAdapter extends BaseAdapter {
private Context context;
Message msg;
private ArrayList<Message> messages;

public SingleChatAdapter(Context context, ArrayList<Message> chat) {

    this.context = context;
    this.messages = chat;
    Log.d("ChatAdapter", "called constructor");

}

public int getCount() {
    return messages.size();
}

public Object getItem(int position) {
    return messages.get(position);
}

public long getItemId(int position) {
    return position;
}

public View getView(int position, View convertView, ViewGroup viewGroup) {

    msg = (Message) getItem(position);

    if (convertView == null) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // TODO message_incoming should be inflated for messages received
        // from server
        convertView = (LinearLayout) inflater.inflate(
                R.layout.message_outgoing, null);

        convertView.setTag(msg);

    } else {

        msg = (Message) convertView.getTag();

    }

    msg.tvmessage = (TextView) convertView
            .findViewById(R.id.tvMessageOutgoing);
    msg.tvtimestamp = (TextView) convertView.findViewById(R.id.tvTimestamp);
    msg.indicator = (ImageView) convertView
            .findViewById(R.id.imgMessageState);

    msg.tvmessage.setText(msg.message);

    msg.tvtimestamp.setText(msg.timestamp);

    return convertView;
}

私のMessageクラスのメッセージ文字列には毎回正しい値が含まれていますが、リストに膨らんだテキストは常に同じままです。私は何が欠けていますか?

4

2 に答える 2

3

elseステートメント(getView内のステートメント)を削除する必要があります。これは次のように機能するためです。convertViewがnull(listViewの最初のアイテムが作成される)の場合、それは膨らみ、メッセージをこのビューのタグとして設定します。ただし、次のアイテムが作成されると、convertViewはnullではなくなり、elseステートメントが呼び出されます。したがって、メッセージは、convertViewにタグとして保存されたメッセージに置き換えられます。

孔子が言及したビデオも見る必要があります:)

于 2013-02-03T13:35:16.863 に答える
2

ListViewがどのように機能するかを理解し、 Roman GuyのこのgetView講演を参照したい場合は、こちらの素晴らしいブログ投稿も参照してください。

于 2013-02-03T13:19:20.473 に答える