0

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?

Gleb
  • 1,412
  • 1
  • 23
  • 55

1 Answers1

1

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);
Rami
  • 7,879
  • 12
  • 36
  • 66
  • thats works, thank you. But why? In the item layout items background and align set like this is incoming message. So this shuld be a default state. – Gleb Oct 08 '15 at 18:48
  • 1
    You're welcome, it's because of [ListView's recycling mechanism](http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works) – Rami Oct 08 '15 at 18:50