Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688

Работа с ListView из потока

21.04.2013, 03:43. Показов 2522. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем здравия!

Вот несколько вопросов, которые не смог разобрать самостоятельно по урокам:

1. как обратиться к списку из отдельного потока?

поясню:
есть список. есть поток, в котором происходит считывание данных из БД и нужно заносить эти данные в список.

Делаю это так:
Java
1
2
3
4
5
6
final ListView mainlist = (ListView) findViewById(R.id.mainlist);
        ArrayList<String> themes = new ArrayList<String>();
        
        final ArrayAdapter<String> adapter;
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, themes);
        mainlist.setAdapter(adapter);
затем в потоке пытался добавить в нужном месте
Java
1
themes.add(0, string);
Ругается на переменную массива.
Вынес это в отдельную функцию, а из потока её просто вызываю. Ситуация идентична.

И второй вопрос:
Нигде не смог найти как добавить subitem в списке.
Он так логично смотрится, можно использовать как описание пункта или ещё для чего, но везде только про добавление непосредственно самих пунктов.

Заранее благодарю!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2013, 03:43
Ответы с готовыми решениями:

Работа с Listview
Доброго времени суток! Передо мной возникла такая проблема: Необходимо сделать так, чтобы при нажатии на разные элементы listview...

Работа с Listview
Доброго времени суток! Передо мной возникла такая проблема: Необходимо сделать так, чтобы при нажатии на разные элементы listview...

Работа с ListView
Нужно что бы при нажатии на один элемент в первом ListView он копировался во второй ListView причём многократно.

9
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 11:50
Изменять UI можно только из UI потока, для этого используются AsyncTask, Handler, activity.runOnUiThread(Runnable action) и другое.
0
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
21.04.2013, 15:05  [ТС]
Инициализировал лист вью внутри потока и попытался к нему добавить элемент вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
final ArrayList<String> theme = new ArrayList<String>();
        final ArrayAdapter<String> adapter;
        final ListView mainlist = (ListView) findViewById(R.id.mainlist);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, theme);
        mainlist.setAdapter(adapter);
        try {
            Log.d("My Logs", "Запускаем поток");
            Thread t = new Thread(new Runnable() {
            public void run() {
        theme.add(0,"добавили");
}
Всё прекрасно, но почему-то если поместить строку
Java
1
theme.add(0,"добавили");
в глубь потока, то программа перестаёт на неё реагировать, при этом лог чист на предмет ошибок, а всё происходит до этой строки и после выполняется прекрасно...
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:10
и в чем вопрос?
0
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
21.04.2013, 15:18  [ТС]
V0v1k, вопрос, собственно, почему программа перестаёт реагировать на добавление итемов?
вот пример:
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
try {
            Log.d("My Logs", "Запускаем поток");
            Thread t = new Thread(new Runnable() {
            public void run() {
                Connection conn = null;
                sPref = getSharedPreferences("Setting", MODE_PRIVATE);
                String hostname = sPref.getString("HOST", "");
                String userName = sPref.getString("mlogin", "");
                String password = sPref.getString("mpass", "");
                String url = "jdbc:mysql://"+hostname+":3306/srv29435_rain";
                            try {
                                Log.d("My Logs", "Подключаем драйвер");
                                Class.forName("com.mysql.jdbc.Driver").newInstance();
                                Log.d("My Logs", "Подключили");                   
                            } catch (InstantiationException e) {
                                Log.d("My Logs", "не подключили");
                                Log.e("My Logs",Log.getStackTraceString(e));
                            } catch (IllegalAccessException e) {
                                Log.d("My Logs", "Не подключили, правов маловато");
                                Log.e("My Logs",Log.getStackTraceString(e));
                            } catch (ClassNotFoundException e) {
                                Log.d("My Logs", "Не подключили класс не найден");
                                Log.e("My Logs",Log.getStackTraceString(e));
                            }
                            try {
                                Log.d("My Logs", "Подключаемся");
                                theme.add(0,"Подключили");
                                conn = DriverManager.getConnection(url, userName, password);
                                Log.d("MyLog", "Подключилось");
Этот код выполняется на ура, а если перенести добавление итема после коннекта вот так
Java
1
2
3
4
Log.d("My Logs", "Подключаемся");
conn = DriverManager.getConnection(url, userName, password);
theme.add(0,"Подключили");
Log.d("MyLog", "Подключилось");
то подключение происходит, всё что идёт дальше по работе программы происходит. а итем в список не добавляется...
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:25
вероятно, в первом случае успеваете добавить прежде чем список отобразится на экране.
и после добавления обычно вызывают
Java
1
adapter.notifyDataSetChanged();
и как я писал выше
Цитата Сообщение от V0v1k Посмотреть сообщение
Изменять UI можно только из UI потока
0
 Аватар для dubok79
325 / 123 / 10
Регистрация: 01.11.2012
Сообщений: 587
21.04.2013, 15:50
Цитата Сообщение от NapalmRain Посмотреть сообщение
И второй вопрос:
Нигде не смог найти как добавить subitem в списке.
Посмотрите этот пост, там есть вложение, в котором проект с примером, я думаю вы поймете, как в listview добавлять не только subitem, но все что душе угодно...
1
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:59
Java
1
2
3
4
5
6
listView.post(new Runnable(){
            public void run() {
                        theme.add(0,"Подключили");
                        adapter.notifyDataSetChanged();
            }
} );
1
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
21.04.2013, 16:11  [ТС]
V0v1k, премного благодарен!
0
216 / 216 / 33
Регистрация: 26.12.2010
Сообщений: 691
21.04.2013, 16:16
Обращаться к ArrayList из разных потоков нужно аккуратней, желательно синхронизировать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.04.2013, 16:16
Помогаю со студенческими работами здесь

Обращение к ListView из потока
Доброго времени суток. Не могу разобраться с доступом к listView с другого потока. Пишу прокси сервер, на каждый запрос браузера создаю...

Взаимодействие ListView и потока
Есть ListView. На форме Mine. В классе, формы Mine. Метод создает поток. И выполняется еще один метод. Из Другова класса Helper. ...

Заполнение ListView из потока
Пытаюсь разобраться с многопоточностью в C# и вот тут такая задача, нужно добавлять строки в ListView (view: Details) Как я понял это...

Добавление элементов в ListView из потока
Опять проблемы. Добавляю элементы в коллекцию, связанную с листвью из потока. Выдает ошибку, Данный тип CollectionView не поддерживает...

Не добавляются элементы в ListView из потока
Private Delegate Sub PagesList(ByVal title As String, ByVal creator_name As String, ByVal id As String, ByVal group_ids As String) '...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru