Search code examples
androidparse-platformmessaginglistitem

Incorrect list view item align from code


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?


Solution

  • 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);