I'm writing a small bubble chat app. Now I'm trying to make different bubbles for incoming and outcoming messages. I want's incoming messages align left and outcoming to right and also with different background images. Now that's works. but sometimes incoming message become align as outcoming. Thats my message adapter code:
public class MessageAdapter extends ArrayAdapter
{
protected Context mContext;
protected List<ParseObject> mMessages;
public MessageAdapter(Context context, List<ParseObject> messages)
{
super(context, R.layout.message_item, messages);
mContext=context;
mMessages=messages;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if(convertView==null)
{
convertView = LayoutInflater.from(mContext).inflate(R.layout.message_item, null);
holder = new ViewHolder();
holder.messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
holder.userNameLabel=(TextView)convertView.findViewById(R.id.userNameLabel);
holder.contentLayout=(LinearLayout)convertView.findViewById(R.id.contentLayout);
convertView.setTag(holder);
}
else
{
holder=(ViewHolder)convertView.getTag();
}
ParseObject message=mMessages.get(position);
holder.userNameLabel.setText(message.getString(ParseConstants.KEY_SENDER_NAME));
String msgText=message.getString(ParseConstants.KEY_MESSAGE_TEXT);
holder.messageTextView.setText(msgText);
String msgSenderUsrId=message.getString(ParseConstants.KEY_SENDER_ID);
String msgCurentUsrId=ParseUser.getCurrentUser().getObjectId();
// if msgCurentUsrId equфls to msgSenderUsrId
// then this is outcoming message
// changing align and background image
if(msgSenderUsrId.equals(msgCurentUsrId))
{
holder.contentLayout.setBackgroundResource(R.drawable.out_message_bg);
LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.RIGHT;
holder.contentLayout.setLayoutParams(lp);
//holder.contentLayout.setVerticalGravity(Gravity.RIGHT);
}
return convertView;
}
public class ViewHolder
{
TextView messageTextView;
TextView userNameLabel;
LinearLayout contentLayout;
}
public void refill(List<ParseObject> messages)
{
mMessages.clear();
mMessages.addAll(messages);
notifyDataSetChanged();
}
}
Also I can't figure out why getView method calls twice. Can anybody help me?
Just add the Else
case in your getView()
method:
LinearLayout.LayoutParams lp= (LinearLayout.LayoutParams) holder.contentLayout.getLayoutParams();
if(msgSenderUsrId.equals(msgCurentUsrId)){
holder.contentLayout.setBackgroundResource(R.drawable.out_message_bg);
lp.gravity=Gravity.RIGHT;
} else {
// set gravity left and the incoming background
holder.contentLayout.setBackgroundResource(R.drawable.in_message_bg);
lp.gravity=Gravity.LEFT;
}
holder.contentLayout.setLayoutParams(lp);