Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
#1

Разделение сообщений в чате на группы - Android

29.11.2015, 15:28. Просмотров 209. Ответов 6
Метки нет (Все метки)

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

Что у меня есть. Есть адаптер и есть фрагмент с которого я шлю сообщения в адаптер. Я приведу часть кода, который для этого используется.

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public class OnlineChatAdapter extends BaseCustomAdapter {
 
    private ArrayList<String> stringArrayList = new ArrayList<>();
 
    public OnlineChatAdapter(Context context) {
        this.context = context;
    }
 
    public void addItem(final String item) {
        stringArrayList.add(item);
        notifyDataSetChanged();
    }
 
    public void addSeparatorItem(final String item) {
        stringArrayList.add(item);
        mSeparatorsSet.add(stringArrayList.size() - 1);
        notifyDataSetChanged();
    }
 
    @Override
    public int getItemViewType(int position) {
        if(mSeparatorsSet.contains(position)) {
            return TYPE_SEPARATOR;
        } else {
            return TYPE_ITEM;
        }
    }
 
    @Override
    public int getViewTypeCount() {
        return super.getViewTypeCount() + 1;
    }
 
    @Override
    public int getCount() {
        return stringArrayList.size();
    }
 
    @Override
    public String getItem(int position) {
        return stringArrayList.get(position);
    }
 
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Holder holder = new Holder();
        String model = null;
        if(stringArrayList.size() > 0) {
            model = getItem(position);
        }
 
        int type = getItemViewType(position);
        if(type == TYPE_ITEM) {
            convertView = inflater.inflate(R.layout.item_full_issue_user, null);
            holder.text = (TextView) convertView.findViewById(R.id.message);
            holder.date = (TextView) convertView.findViewById(R.id.date);
            holder.corner = (ImageView) convertView.findViewById(R.id.corner);
            holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
            holder.date.setVisibility(View.GONE);
 
            if(model != null) {
                holder.text.setText(model);
            }
            
            //это надо прятать
            holder.avatar.setVisibility(View.INVISIBLE);
            holder.corner.setVisibility(View.INVISIBLE);
            
        } else {
            convertView = inflater.inflate(R.layout.item_full_issue_admin, null);
            holder.text = (TextView) convertView.findViewById(R.id.message);
            holder.date = (TextView) convertView.findViewById(R.id.date);
            holder.corner = (ImageView) convertView.findViewById(R.id.corner);
            holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
            holder.date.setVisibility(View.GONE);
 
            if(model != null) {
                holder.text.setText(model);
            }
 
            //это надо прятать
            holder.avatar.setVisibility(View.INVISIBLE);
            holder.corner.setVisibility(View.INVISIBLE);
        }
        return convertView;
    }
 
    public class Holder {
        TextView text;
        TextView date;
        ImageView corner;
        ImageView avatar;
    }
}


для теста вот так заполняю адаптер
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
OnlineChatAdapter onlineChatAdapter = new OnlineChatAdapter(context);
listView.setAdapter(onlineChatAdapter);
 
onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addSeparatorItem("papapapa");
        onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addSeparatorItem("papapapa");
        onlineChatAdapter.addSeparatorItem("papapapa");
        onlineChatAdapter.addSeparatorItem("papapapa");
        onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addSeparatorItem("papapapa");
        onlineChatAdapter.addItem("lalalala");
        onlineChatAdapter.addSeparatorItem("papapapa");
        onlineChatAdapter.addSeparatorItem("papapapa");
        onlineChatAdapter.addSeparatorItem("papapapa");
Подскажите что сделать что бы работало как надо, мозг уже сломал.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
254 / 230 / 93
Регистрация: 11.01.2015
Сообщений: 649
29.11.2015, 15:45     Разделение сообщений в чате на группы #2
dajver, можно попробовать хранить в статической переменной последнего "оратора". Если при новом сообщении "ораторы" не совпадают, то рисуй аватарку. ))
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
29.11.2015, 15:56  [ТС]     Разделение сообщений в чате на группы #3
Цитата Сообщение от Mikalai Посмотреть сообщение
dajver, можно попробовать хранить в статической переменной последнего "оратора". Если при новом сообщении "ораторы" не совпадают, то рисуй аватарку. ))
Для начала мне бы хотя бы прятать после первого сообщения все остальные аватарки. Да и плюс как мне узнать когда последний оратор закончил оратовать, у меня нигде нет такой инфы
Mikalai
254 / 230 / 93
Регистрация: 11.01.2015
Сообщений: 649
29.11.2015, 16:22     Разделение сообщений в чате на группы #4
dajver, я бы держал список сообщений примерно в таком виде:
Java
1
2
3
4
5
public class Message {
    String userName;
    String message;
    String time;
}
ну а в адаптере делал бы так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CustomAdapter extends BaseAdapter {
 
    List<Message> messages = new LinkedList<>();
    static String lastSpeaker;
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //...
        if(messages.get(position).userName.equals(lastSpeaker)) {
            //прячем аватарку
        } else {
            this.lastSpeaker = messages.get(position).userName;
            //показываем аватарку
        }
        //...
    }
}
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
29.11.2015, 17:48  [ТС]     Разделение сообщений в чате на группы #5
Цитата Сообщение от Mikalai Посмотреть сообщение
я бы держал список сообщений примерно в таком виде:
попробовал, как вы скзали, прячет все аватарки, безвыборочно

адаптер
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class OnlineChatAdapter extends BaseCustomAdapter {
 
//    private ArrayList<String> stringArrayList = new ArrayList<>();
    private List<MessageModel> messages = new LinkedList<>();
    private static String lastSpeaker;
 
    public OnlineChatAdapter(Context context) {
        this.context = context;
    }
 
    public void addItem(final MessageModel item) {
//        stringArrayList.add(item);
        messages.add(item);
        notifyDataSetChanged();
    }
 
    public void addSeparatorItem(final MessageModel item) {
//        stringArrayList.add(item);
        messages.add(item);
        mSeparatorsSet.add(messages.size() - 1);
        notifyDataSetChanged();
    }
 
    @Override
    public int getItemViewType(int position) {
        if(mSeparatorsSet.contains(position)) {
            return TYPE_SEPARATOR;
        } else {
            return TYPE_ITEM;
        }
    }
 
    @Override
    public int getViewTypeCount() {
        return super.getViewTypeCount() + 1;
    }
 
    @Override
    public int getCount() {
        return messages.size();
    }
 
    @Override
    public MessageModel getItem(int position) {
        return messages.get(position);
    }
 
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Holder holder = new Holder();
        MessageModel model = null;
        if(messages.size() > 0) {
            model = getItem(position);
        }
 
        int type = getItemViewType(position);
        if(type == TYPE_ITEM) {
            convertView = inflater.inflate(R.layout.item_full_issue_user, null);
            holder.text = (TextView) convertView.findViewById(R.id.message);
            holder.date = (TextView) convertView.findViewById(R.id.date);
            holder.corner = (ImageView) convertView.findViewById(R.id.corner);
            holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
            holder.date.setVisibility(View.GONE);
 
            if(model != null) {
                holder.text.setText(model.getMessage());
            }
 
            if(messages.get(position).getUserName().equals(lastSpeaker)) {
                //прячем аватарку
                holder.avatar.setVisibility(View.INVISIBLE);
                holder.corner.setVisibility(View.INVISIBLE);
            } else {
                this.lastSpeaker = messages.get(position).getUserName();
                holder.avatar.setVisibility(View.VISIBLE);
                holder.corner.setVisibility(View.VISIBLE);
                //показываем аватарку
            }
 
        } else {
            convertView = inflater.inflate(R.layout.item_full_issue_admin, null);
            holder.text = (TextView) convertView.findViewById(R.id.message);
            holder.date = (TextView) convertView.findViewById(R.id.date);
            holder.corner = (ImageView) convertView.findViewById(R.id.corner);
            holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
            holder.date.setVisibility(View.GONE);
 
            if(model != null) {
                holder.text.setText(model.getMessage());
            }
 
            //это надо прятать
//            holder.avatar.setVisibility(View.INVISIBLE);
//            holder.corner.setVisibility(View.INVISIBLE);
        }
        return convertView;
    }
 
    public class Holder {
        TextView text;
        TextView date;
        ImageView corner;
        ImageView avatar;
    }
}


как заполняю
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 MessageModel userModel = new MessageModel("lala", "user");
        MessageModel agentModel = new MessageModel("dfgfdh", "agent");
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addItem(userModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
        onlineChatAdapter.addSeparatorItem(agentModel);
Mikalai
254 / 230 / 93
Регистрация: 11.01.2015
Сообщений: 649
29.11.2015, 19:17     Разделение сообщений в чате на группы #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
dajver, статическая переменная плохой вариант. Лучше сравнивать текущего оратора и предыдыщего примерно так:
Java
1
2
3
4
5
6
7
8
        String speaker = data.get(position).userName;
        String previousSpeaker = position == 0 ? null : data.get(position - 1).userName;
 
        if(speaker.equals(previousSpeaker)) {
            imageView.setVisibility(View.INVISIBLE);
        } else {
            imageView.setVisibility(View.VISIBLE);
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2015, 19:47     Разделение сообщений в чате на группы
Еще ссылки по теме:

Разделение экрана на 2 части Android
Стек сообщений GCM Android
Рассылка сообщений группе устройств Android
Разделение Stream Android
Android Приём сообщений от сервера в фоне

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
dajver
407 / 271 / 18
Регистрация: 18.09.2010
Сообщений: 1,106
29.11.2015, 19:47  [ТС]     Разделение сообщений в чате на группы #7
Цитата Сообщение от Mikalai Посмотреть сообщение
dajver, статическая переменная плохой вариант. Лучше сравнивать текущего оратора и предыдыщего примерно так:
идеально! спасибо огромное
Yandex
Объявления
29.11.2015, 19:47     Разделение сообщений в чате на группы
Ответ Создать тему
Опции темы

Текущее время: 00:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru