2015-10-08 8 views
0

Я пишу небольшое приложение для чата. Теперь я пытаюсь сделать разные пузыри для входящих и исходящих сообщений. Я хочу, чтобы входящие сообщения выравнивались влево и вправо, а также с разными фоновыми изображениями. Теперь это работает. но иногда входящее сообщение выравнивается как исходящее. Вот мой код кода сообщения:Неверный элемент списка списка из кода

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

Просто добавьте 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); 
+0

тот работает, спасибо. Но почему? В элементах элементов макета элементов фон и выравнивание, установленные таким образом, являются входящим сообщением. Таким образом, это будет состояние по умолчанию. – Gleb

+1

Добро пожаловать, это из-за механизма перебора ListView (http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works) – Rami

+1

спасибо за ссылку. Очень полезно. – Gleb