Аватар для dajver
411 / 275 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
1

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

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

Author24 — интернет-сервис помощи студентам
Всем привет, у меня тут проблема которую я без понятия как решить. В общем для одного проекта нужен чат, его я сделал, но людишки хотят что бы если юзер пишет сообщения они групировались в группы, типа как в скайпе, пишем 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");
Подскажите что сделать что бы работало как надо, мозг уже сломал.
0
Лучшие ответы (1)
29.11.2015, 15:28
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2015, 15:28
Ответы с готовыми решениями:

Отодвигание listView при написании сообщений в чате
Как отодвинуть listView при написании сообщений в чате? Вот мой xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; ...

Вывод сообщений в чате
Ребзя привет! В общем сообщения в чате записываются в файл, хочу переписать на mysql. Добавить сообщения в таблицу я смог, а вот...

Непрерывное обновление сообщений в чате
думаю все из вас встречались с подобным скриптом, который я приведу чуть ниже. Он непрерывно выводит сообщения в чат, просто непрерывно...

6
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
29.11.2015, 15:45 2
dajver, можно попробовать хранить в статической переменной последнего "оратора". Если при новом сообщении "ораторы" не совпадают, то рисуй аватарку. ))
1
 Аватар для dajver
411 / 275 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
29.11.2015, 15:56  [ТС] 3
Цитата Сообщение от Mikalai Посмотреть сообщение
dajver, можно попробовать хранить в статической переменной последнего "оратора". Если при новом сообщении "ораторы" не совпадают, то рисуй аватарку. ))
Для начала мне бы хотя бы прятать после первого сообщения все остальные аватарки. Да и плюс как мне узнать когда последний оратор закончил оратовать, у меня нигде нет такой инфы
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
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;
            //показываем аватарку
        }
        //...
    }
}
1
 Аватар для dajver
411 / 275 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
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);
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
29.11.2015, 19:17 6
Лучший ответ Сообщение было отмечено dajver как решение

Решение

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);
        }
1
 Аватар для dajver
411 / 275 / 22
Регистрация: 18.09.2010
Сообщений: 1,114
29.11.2015, 19:47  [ТС] 7
Цитата Сообщение от Mikalai Посмотреть сообщение
dajver, статическая переменная плохой вариант. Лучше сравнивать текущего оратора и предыдыщего примерно так:
идеально! спасибо огромное
0
29.11.2015, 19:47
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.11.2015, 19:47
Помогаю со студенческими работами здесь

Порядок отображения сообщений в чате
Столкнулся с такой проблемой при разработке локального чата в С#, при передаче многих сообщений в richtextbox не отображаются первыми...

Как сделать в чате посылку частных сообщений?
Как сделать в чате посылку частных сообщений. Так чтобы открывалось окошко у посылающего чатовца куда он пишет сообщение и у получающего...

Не отображаются ники при отправке сообщений в чате чата
В чате при отправке сообщений не отображаются ники(подскажите в чём ошибка? import java.net.*; import java.util.Scanner; import...

Вопросительный знак вместо русских букв при отправке сообщений в TCP-чате
Помогите пожалуйста новичку сделать,чтобы можно было русскими писать.

Разделение строк в StringGrid на группы
Гляньте картинку. Надо сделать то же самое с помощью нормального StringGrid. Каким образом можно разделить строки StringGrid на...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
Laravel или Symfony: что лучше для старта?
Wired 18.02.2025
В веб-разработке выбор правильного фреймворка может стать определяющим фактором успеха проекта. Особенно это актуально для PHP - одного из самых распространенных языков программирования, где Laravel. . .
Что нового в Laravel 12
Wired 18.02.2025
С момента своего появления в 2011 году Laravel постоянно развивается, внедряя инновационные решения и совершенствуя существующие возможности. В начале 2025 года ожидается выход Laravel 12 - новой. . .
Роутер в Laravel: как работать с маршрутами
Wired 18.02.2025
Маршрутизация - один из основополагающих элементов любого веб-приложения на Laravel, определяющий как приложение отвечает на HTTP-запросы к различным URL-адресам. По сути, роутинг - это механизм. . .
Интеграция шаблона Bootstrap в Laravel PHP
Wired 18.02.2025
Разработка веб-приложений в современном мире требует не только надежного бэкенда, но и привлекательного, отзывчивого интерфейса. Laravel, как один из самых популярных PHP-фреймворков, отлично. . .
Использование контроллеров и middleware в Laravel PHP
Wired 18.02.2025
Современная веб-разработка требует четкой организации кода и эффективного управления потоком HTTP-запросов. Laravel, как один из ведущих PHP-фреймворков, предоставляет два мощных инструмента для. . .
Фильтрация массива по неточному соответствию элементам другого массива в JavaScript
Wired 18.02.2025
При работе с массивами данных в JavaScript иногда возникает задача поиска и фильтрации элементов по неточному соответствию. В отличие от точного сравнения, когда мы ищем полное совпадение значений,. . .
Создаем SPA Router на чистом JavaScript
bytestream 17.02.2025
В современной веб-разработке одностраничные приложения (SPA) стали стандартом для создания динамичных и отзывчивых пользовательских интерфейсов. Ключевым компонентом любого SPA является роутер -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru