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

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

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

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

21.04.2013, 03:43. Просмотров 780. Ответов 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 из потока
Посмотрите здесь:

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

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

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

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

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

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

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

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

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

Как отфильтровать в ListView данные из потока ? - Visual Basic
Всем Здравствуйте !!! Вопрос. Как отфильтровать в ListView данные из потока по первой букве ??? Спасибо.

.NET 4.x Передача потока данных из listview в textbox и обратно - C#
Доброго дня всем.) Есть форма1 с listview. ListView считывает текстовый файл с данными.(Пример одной записи:...

Работа из потока - C#
Как обратиться к компоненту на форме из потока? private void button1_Click(object sender, EventArgs e) { ...

Странная работа потока - C++ Builder
Вообщем не могу понять в чем дело, есть программа: //--------------------------------------------------------------------------- ...


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

Или воспользуйтесь поиском по форуму:
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
21.04.2013, 16:16     Работа с ListView из потока #10
Обращаться к ArrayList из разных потоков нужно аккуратней, желательно синхронизировать.
Yandex
Объявления
21.04.2013, 16:16     Работа с ListView из потока
Ответ Создать тему
Опции темы

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