Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
NapalmRain
41 / 41 / 6
Регистрация: 18.05.2010
Сообщений: 655
1

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

21.04.2013, 03:43. Просмотров 953. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2013, 03:43
Ответы с готовыми решениями:

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

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

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

Вызов курсора с параметром или Работа с ListView
Мужики, помогите пожалуйста, Не могу найти как это сделать. Время поджимает....

ListView. После добавления кнопки перестал быть доступен сам ListView
Кастомизировал ListView с помощью нескольких TextView. Но после того, как...

9
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 11:50 2
Изменять UI можно только из UI потока, для этого используются AsyncTask, Handler, activity.runOnUiThread(Runnable action) и другое.
0
NapalmRain
41 / 41 / 6
Регистрация: 18.05.2010
Сообщений: 655
21.04.2013, 15:05  [ТС] 3
Инициализировал лист вью внутри потока и попытался к нему добавить элемент вот так:
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
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:10 4
и в чем вопрос?
0
NapalmRain
41 / 41 / 6
Регистрация: 18.05.2010
Сообщений: 655
21.04.2013, 15:18  [ТС] 5
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
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:25 6
вероятно, в первом случае успеваете добавить прежде чем список отобразится на экране.
и после добавления обычно вызывают
Java
1
adapter.notifyDataSetChanged();
и как я писал выше
Цитата Сообщение от V0v1k Посмотреть сообщение
Изменять UI можно только из UI потока
0
dubok79
324 / 122 / 10
Регистрация: 01.11.2012
Сообщений: 586
21.04.2013, 15:50 7
Цитата Сообщение от NapalmRain Посмотреть сообщение
И второй вопрос:
Нигде не смог найти как добавить subitem в списке.
Посмотрите этот пост, там есть вложение, в котором проект с примером, я думаю вы поймете, как в listview добавлять не только subitem, но все что душе угодно...
1
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:59 8
Java
1
2
3
4
5
6
listView.post(new Runnable(){
            public void run() {
                        theme.add(0,"Подключили");
                        adapter.notifyDataSetChanged();
            }
} );
1
NapalmRain
41 / 41 / 6
Регистрация: 18.05.2010
Сообщений: 655
21.04.2013, 16:11  [ТС] 9
V0v1k, премного благодарен!
0
NiRamz
211 / 211 / 33
Регистрация: 26.12.2010
Сообщений: 691
21.04.2013, 16:16 10
Обращаться к ArrayList из разных потоков нужно аккуратней, желательно синхронизировать.
0
21.04.2013, 16:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 16:16

Listview вывод данных и переход по нажатию на другой Listview SQLite
Доброго извините за название темы, долго не мог сформировать название, В общем...

Передача данных из ListView в другой Activity в ListView
Добрый день. Пытаюсь разобраться с передачей данных с ListView, но выходит что...

Данные из SQlite в ListView, обработка события ListView
Ребят, есть БД, ListView. Надо при нажатии на строчку ListView вытащить данные...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru