Я пишу небольшое приложение для чата. Теперь я пытаюсь сделать разные пузыри для входящих и исходящих сообщений. Я хочу, чтобы входящие сообщения выравнивались влево и вправо, а также с разными фоновыми изображениями. Теперь это работает. но иногда входящее сообщение выравнивается как исходящее. Вот мой код кода сообщения:Неверный элемент списка списка из кода
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 вызывает два раза. Кто-нибудь может мне помочь?
тот работает, спасибо. Но почему? В элементах элементов макета элементов фон и выравнивание, установленные таким образом, являются входящим сообщением. Таким образом, это будет состояние по умолчанию. – Gleb
Добро пожаловать, это из-за механизма перебора ListView (http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works) – Rami
спасибо за ссылку. Очень полезно. – Gleb