@sergei1094

Как сделать правильно разметку ListView, по типу — чат?

Здравствуйте. Подскажите пожалуйста. У меня с сервера подгружаются сообщения в `ListView`. Я хочу сделать так....кода строится список в ListView, я хочу что бы моё(usera) сообщение было слева, а сообщение собеседнка выстраивалось с права. Как правильно реализовать подмену item'ов на user.xml или на sobesednik.xml в зависимости от логики по типу: Если ИД юзера в item == моемуИД, то показывай user.xml, иначе....думаю понятно) Подскажите если не трудно, вот мой адаптер, точнее то что я с ним сотворил :)
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);

По самой сути этот код вроде как и работает, а вроде и нет :)
Когда загружается ListView, мои сообщения, и сообщения собеседника приняли нужные положения до тех пор пока я не начал листать вниз. Как только я прокручивал скролл обратно на верх, первые два объекта потеряли свои wrap_content и gravity[]. Проще говоря....покажу скрины. На рис.1 показан только что загрузившийся список, на рис2., сама проблема.
-
рис1.
57fb902bdfd548b5bf60e05d9eedc642.png
рис.2
c67694d2b40643f4a5b321923953d0c8.png
  • Вопрос задан
  • 462 просмотра
Пригласить эксперта
Ответы на вопрос 1
@alaershov
Android-developer
Не используйте ListView, используйте RecyclerView.
В адаптере у него есть отличный метод:
getItemViewType(int position);
Он по номеру элемента определяет, к какому виду относится этот элемент, и возвращает его числовой код. Код и реализацию этого метода нужно сделать вам самостоятельно.
Потом этот код подаётся (системой) в
createViewHolder(ViewGroup parent, int viewType)
В этом методе вы можете создавать нужный вам View из нужного layout. Не нужно этого:
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));
}


Просто сделайте два класса ViewHolder и разные layout для них.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы