2015-10-08 1 views
0

J'écris une petite application de chat de bulle. Maintenant, j'essaie de faire des bulles différentes pour les messages entrants et sortants. Je veux que les messages entrants s'alignent à gauche et en sortie à droite et aussi avec différentes images de fond. Maintenant ça marche. mais parfois le message entrant devient aligné comme sortant. C'est mon code adaptateur de message:article de liste de liste incorrect aligner du 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(); 
     } 
    } 

Aussi je ne peux pas comprendre pourquoi les appels de méthode getView deux fois. Quelqu'un peut-il m'aider?

Répondre

1

il suffit d'ajouter le cas Else dans votre méthode 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

des thats travaux, je vous remercie. Mais pourquoi? Dans les éléments de mise en page d'élément, l'arrière-plan et l'alignement définis comme ceci sont des messages entrants. Donc, ceci devrait être un état par défaut. – Gleb

+1

De rien, c'est à cause du [mécanisme de recyclage de ListView] (http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works) – Rami

+1

merci pour le lien. Très utile. – Gleb