Доброго всем времени суток. У меня есть не большая проблема с разметкой ListView именно программным путём. Дело в том что я с сервера подгружаю сообщения, и, когда они загружаются я пытаюсь изменить гравитацию объектов, в зависимости от различия ID. В данном случае LinearLayout. В общем что я хочу....кода строится список в ListView, я хочу что моё сообщение было слева, а сообщение юзера выстраивалось по гравитации, с права. Сейчас покажу на скриншотах как я уже сделал. Может это не правильно? На рисунке первом, показано как Сообщения загрузились и список построился. Но если прокрутить ListView вниз и поднятся на верх, на рисунке втором видно, как (первые два) объекта потеряли гравитацию. Подскажите направление. За ранее спасибо :)
class ChatAdapter extends SimpleAdapter {
public ChatAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to){
super(context, data, resource, from, to);
}
public View getView(int position, View convertView, ViewGroup parent){
View v = super.getView(position, convertView, parent);
LinearLayout layout = (LinearLayout) v.findViewById(R.id.layoutUsersMsg);
LinearLayout layoutBg = (LinearLayout) v.findViewById(R.id.layoutUsersMsgBg);
layout.setBackground(getResources().getDrawable(R.drawable.lv_msg_styles));
TextView textView = (TextView) v.findViewById(R.id.id_msg_user);
TextView userText = (TextView) v.findViewById(R.id.msg);
String myIDfromList = textView.getText().toString();
if(!myIDfromList.equals(LV_USID)) {
layout.setGravity(Gravity.RIGHT);
layoutBg.setBackground(getResources().getDrawable(R.drawable.user_style_msg));
} else {
layout.setGravity(Gravity.LEFT);
layoutBg.setBackground(getResources().getDrawable(R.drawable.my_style_msg));
}
return v;
}
}
ListView и построение адаптера
String msg = msgList.getString("msg");
String msg_id = msgList.getString("msg_id");
final String msg_id_us = msgList.getString("msg_id_user");
map = new HashMap<String, Object>();
map.put(LV_MSGID, msg_id);
map.put(LV_MSG, msg);
map.put(LV_USID_MSG, msg_id_us);
data.add(map);
}
String[] from = { LV_MSGID, LV_MSG, LV_USID_MSG };
int [] to = { R.id.id_msg, R.id.msg, R.id.id_msg_user };
sAdapter = new ChatAdapter(FriendMsgActivity.this, data, R.layout.activity_friend_msg_adapter, from, to);
sList = (ListView) findViewById(R.id.lvFriendMsg);
sList.setAdapter(sAdapter);
Рисунок номер 1
Рисунок номер 2
Вот получившийся на текущий момент адаптер:
class ChatAdapter extends SimpleAdapter {
public ChatAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to){
super(context, data, resource, from, to);
}
public class ViewHolder {
private LinearLayout layout;
private LinearLayout layoutBg;
private TextView textView;
private TextView userText;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
//View v = super.getView(position, convertView, parent);
ViewHolder viewHolder;
if(convertView == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.activity_friend_msg_adapter, parent, false);
viewHolder = new ViewHolder();
viewHolder.layout = (LinearLayout) convertView.findViewById(R.id.layoutUsersMsg);
viewHolder.layoutBg = (LinearLayout) convertView.findViewById(R.id.layoutUsersMsgBg);
viewHolder.textView = (TextView) convertView.findViewById(R.id.id_msg_user);
viewHolder.userText = (TextView) convertView.findViewById(R.id.msg);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String myIDfromList = viewHolder.textView.getText().toString();
viewHolder.layout.setBackground(getResources().getDrawable(R.drawable.lv_msg_styles));
if(!myIDfromList.equals(LV_USID)) {
viewHolder.layout.setGravity(Gravity.RIGHT);
viewHolder.layoutBg.setBackground(getResources().getDrawable(R.drawable.user_style_msg));
} else {
viewHolder.layout.setGravity(Gravity.LEFT);
viewHolder.layoutBg.setBackground(getResources().getDrawable(R.drawable.my_style_msg));
}
return convertView;
}
}


View v = super.getView(position, convertView, parent);- Вам бы надо паттерн ViewHolder реализовать. Разметка элементов переиспользуется и в вашем случае подгрузилась широкая разметка и она попыталась преобразоваться к старому виду. Но неуспешно. ViewHolder, возможно, решит проблему – ЮрийСПб Oct 03 '16 at 17:27convertView = inflater.inflate(R.layout.activity_friend_msg_adapter, parent, false);из 7-ми строк, вместо моих сообщений. Т.е по факту список загрузился, но вместо сообщений, шаблонное наименование. Почему так? – sergei1094 Oct 03 '16 at 23:07View, вам нужно создать две разметки (для пользователя и собеседника), затем переопределить метод адаптераgetItemViewType(), где определяется, какой тип разметки выводить в текущий айтем. Вариант реализации смотрите этот ответ. ViewHolder имеет другое назначение (кэширование ссылок на виджеты) и к решению именно вашей проблемы несколько далек. – pavlofff Oct 04 '16 at 06:06getItemViewType(). На самом деле, я запутался в самой логики этой задачи. Я переопределил методgetItemViewType()в нём возвращаюposition, далее вgetView()я свитчем должен определить какой именно layout показать? Продемонстрируйте пример пожалуйста, если вам не трудно. Спасибо – sergei1094 Oct 04 '16 at 21:04