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

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

Войти
Регистрация
Восстановить пароль
 
NapalmRain
38 / 38 / 3
Регистрация: 18.05.2010
Сообщений: 631
#1

Работа с ListView из потока - Программирование Android

21.04.2013, 03:43. Просмотров 796. Ответов 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 в списке.
Он так логично смотрится, можно использовать как описание пункта или ещё для чего, но везде только про добавление непосредственно самих пунктов.

Заранее благодарю!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2013, 03:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с ListView из потока (Программирование Android):

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

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

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

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

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

Данные из SQlite в ListView, обработка события ListView - Программирование Android
Ребят, есть БД, ListView. Надо при нажатии на строчку ListView вытащить данные int из БД. mList.setOnItemClickListener(new...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 11:50 #2
Изменять UI можно только из UI потока, для этого используются AsyncTask, Handler, activity.runOnUiThread(Runnable action) и другое.
NapalmRain
38 / 38 / 3
Регистрация: 18.05.2010
Сообщений: 631
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,"добавили");
в глубь потока, то программа перестаёт на неё реагировать, при этом лог чист на предмет ошибок, а всё происходит до этой строки и после выполняется прекрасно...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:10 #4
и в чем вопрос?
NapalmRain
38 / 38 / 3
Регистрация: 18.05.2010
Сообщений: 631
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", "Подключилось");
то подключение происходит, всё что идёт дальше по работе программы происходит. а итем в список не добавляется...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
21.04.2013, 15:25 #6
вероятно, в первом случае успеваете добавить прежде чем список отобразится на экране.
и после добавления обычно вызывают
Java
1
adapter.notifyDataSetChanged();
и как я писал выше
Цитата Сообщение от V0v1k Посмотреть сообщение
Изменять UI можно только из UI потока
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
21.04.2013, 15:50 #7
Цитата Сообщение от NapalmRain Посмотреть сообщение
И второй вопрос:
Нигде не смог найти как добавить subitem в списке.
Посмотрите этот пост, там есть вложение, в котором проект с примером, я думаю вы поймете, как в listview добавлять не только subitem, но все что душе угодно...
V0v1k
1158 / 982 / 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();
            }
} );
NapalmRain
38 / 38 / 3
Регистрация: 18.05.2010
Сообщений: 631
21.04.2013, 16:11  [ТС] #9
V0v1k, премного благодарен!
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
21.04.2013, 16:16 #10
Обращаться к ArrayList из разных потоков нужно аккуратней, желательно синхронизировать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 16:16
Привет! Вот еще темы с ответами:

ListView, ToggleButton, SQLite, CursorAdapter. Как найти idItem в ListView, где была нажата ToggleButton? - Программирование Android
Добрый день. Затрудняюсь понять один момент: У меня есть ListView, который заполнен Items. Каждый Item - это свой XML. Пока...

Копирование данных из 1 listView во 2 listView - Программирование Android
Нужно что бы при нажатии на один элемент в первом ListView он копировался во второй ListView причём многократно.Но я использую...

Переход из Listview в Listview - Программирование Android
Как сделать, что бы когда нажимаешь в главном листвью на кнопку, открывалось новое нужное(т.е. то по которому тапнули) активити с другим...

Использование ListView в ListView - Программирование Android
Всем привет. Можете показать как использовать ListView в ListView, с заполнением как внешнего ListView, так и внутреннего причем с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.04.2013, 16:16
Ответ Создать тему
Опции темы

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