ListView
ユーザーが送信したメッセージが白で表示され、友人が受信したメッセージが青で表示される、多数の行からチャットビューが形成されるチャットアプリケーションを作成しました。
この動作は正常に機能しますが、非常に大きくなった後(たとえば、30行)にリストをスクロールすると、色が乱れます。行ごとに異なるレイアウト、白い行のレイアウトと青い行のレイアウトを使用します。
リストを上下に複数回スクロールすると、色がランダムに切り替わり続けます(つまり、メッセージの一部が青で、他のメッセージが白で、もう一方の端(チャットしている友人)が白になり、他のメッセージが青になります。ランダムな方法。
使用したコードのプレビューを簡単に説明します。
これはgetView
私のカスタムアダプタのメソッドであり、以下を拡張しますBaseAdapter
。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
final int pos = position;
String from = messages.get(pos).getFrom();
if (convertView == null) {
holder = new ViewHolder();
// If message is sent by me (the user)
if(from.toString().toLowerCase().equals("me")){
convertView = mInflater.inflate(R.layout.chat_msg_row2, null);
}
// if message is sent by his friend (the other end user)
else{
convertView = mInflater.inflate(R.layout.chat_msg_row, null);
}
holder.userName = (TextView) convertView.findViewById(R.id.msgusername);
holder.userImage = (ImageView) convertView.findViewById(R.id.ppic);
holder.date = (TextView) convertView.findViewById(R.id.msgdate);
holder.text = (TextView) convertView.findViewById(R.id.msg);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.userName.setText( messages.get(pos).getFrom() );
holder.text.setText( messages.get(pos).getText() );
holder.date.setText( messages.get(pos).getDate() );
String img = messages.get(pos).getImage();
if(img.substring(0,4).equalsIgnoreCase("http") ){
try{
ImageLoader imloader = new ImageLoader( ChatActivity.this );
holder.userImage.setTag(img);
imloader.DisplayImage( img, ChatActivity.this , holder.userImage );
}
catch(Exception e){
e.printStackTrace();
}
}
return convertView;
}
public long getItemId(int position){
return 1;
}
public class ViewHolder{
TextView userName;
ImageView userImage;
TextView text;
TextView date;
}
2つのレイアウトchat_msg_row2
とchat_msg_row
は、1つが白い画像を使用し、もう1つが青い画像を使用するDrawableを使用していることを除いて、同じです。