不正确的列表视图项与代码对齐

时间:2015-10-08 18:32:56

标签: android parse-platform messaging listitem

我正在写一个小型泡泡聊天应用。现在,我试图为传入和传出的消息制作不同的气泡。我希望传入的消息左对齐和向右对齐,也可以使用不同的背景图像。现在这样做了。但有时传入的消息会变为对齐。那是我的消息适配器代码:

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();
        }
    }

此外,我无法弄清楚为什么getView方法会调用两次。有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

只需在Else方法中添加getView()案例:

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