Урок 42. Список - ListView

Обсуждение уроков
Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 42. Список - ListView

Сообщение Napalm » 21 апр 2013, 14:10

С управлением из потока почти разобрался
Инициализировал лист вью внутри потока и попытался к нему добавить элемент вот так:
[syntax=java]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,"добавили");
}[/syntax]
Всё прекрасно, но почему-то если поместить строку
[syntax=java]theme.add(0,"добавили");
[/syntax]
в глубь потока, то программа перестаёт на неё реагировать, при этом лог чист на предмет ошибок, а всё происходит до этой строки и после выполняется прекрасно...

а по поводу subitems
Вот картинка:
Изображение
Мы наблюдаем тут список и item1, item2, ..., itemN
и под ними subitem1, subitem2, ..., subitemN

Так вот если выполнять урок, то получаем просто список из набора item, а вот как добавить к визуализации и subitem нигде не смог найти.
Последний раз редактировалось Napalm 21 апр 2013, 14:19, всего редактировалось 1 раз.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 21 апр 2013, 14:17

форматни код, лень читать))
Так будет выглядеть список с кастомным адаптером, нужно свою строчку в виде вьюшки xml сделать, тогда в строку можно столько запихнуть! и внизу и справа и слева и галочки всякие, и кнопочки - что угодно.
Почитай урок.
http://startandroid.ru/ru/uroki/vse-uro ... apter.html
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 42. Список - ListView

Сообщение Napalm » 21 апр 2013, 14:21

Благодарю! С этим постараюсь разобраться.
Прошу подсказать, почему происходит вот такая ерунда:
вот пример:
[syntax=java]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", "Подключилось");[/syntax]

Этот код выполняется на ура, а если перенести добавление итема после коннекта вот так
[syntax=java]Log.d("My Logs", "Подключаемся");
conn = DriverManager.getConnection(url, userName, password);
theme.add(0,"Подключили");
Log.d("MyLog", "Подключилось");[/syntax]
то подключение происходит, всё что идёт дальше по работе программы происходит. а итем в список не добавляется...

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 21 апр 2013, 14:28

оно-то добавляется скорее всего, просто или адаптер потом устанавливай или делай списку notifyDataSetChanged();, о том, что данные изменились.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 42. Список - ListView

Сообщение Napalm » 21 апр 2013, 14:51

перенёс в самый конец функции с потоком
уже после вызова и выполнения
[syntax=java]adapter.notifyDataSetChanged();
mainlist.setAdapter(adapter);[/syntax]
вижу белый экран,
вот полный код функции...
[syntax=java]void ReadList() {
final ListView mainlist = (ListView) findViewById(R.id.mainlist);
final ArrayAdapter<String> adapter;
final ArrayList<String> theme = new ArrayList<String>();
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, theme);
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", "Подключаемся");
conn = DriverManager.getConnection(url, userName, password);
Log.d("MyLog", "Подключилось");
Statement s = null;
s = conn.createStatement();
Log.d("MyLog", "Отправляем запрос");
s.executeQuery("Select * from users");
Log.d("MyLog", "Отправили");
ResultSet rs = null;
Log.d("MyLog", "Получаем ответ");
rs = s.getResultSet();
Log.d("MyLog", "Получили");
while (rs.next()) {
String passN = rs.getString("pass");
String loginN = rs.getString("login");
theme.add(0,loginN);
}
rs.close();
s.close();
} catch (Exception e) {
Log.d("My Logs", "Не получилось");
Log.e("My Logs",Log.getStackTraceString(e));
}
try {
if (conn!=null) conn.close();
} catch (Exception e) {
Log.e("My Logs",Log.getStackTraceString(e));
}
}
});
t.start();
} catch (Exception e) {
Log.e("My Logs",Log.getStackTraceString(e));
System.err.println("Не вышло");
}
adapter.notifyDataSetChanged();
mainlist.setAdapter(adapter);
}[/syntax]
:cry:

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 21 апр 2013, 15:12

ну вот смотри, ты запустил поток. Ты думаешь, что система будет ждать его окончания, чтоб выполнить операторы строки 66 и 67?? ЭТо же поток!
А андроид так устроен, что он в некоторых случаях и просто выполнения текущих операторов (без потока) не ожидает.
тебе нужен механизм Handler-ов, чтоб поток сигналил UI - "я завершился, адаптер, обновляйся!"
дочитывай про потоки :)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 42. Список - ListView

Сообщение Napalm » 21 апр 2013, 15:20

Проблема решилась добавлением
[syntax=java]
mainlist.post(new Runnable(){
public void run() {
theme.add(0,"Подключили");
adapter.notifyDataSetChanged();
}
} );[/syntax]

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 21 апр 2013, 15:36

ничего не поняла. Просто добавить два слова в список можно и без потока в интерфейсе. Поток становится в очередь. Но на самом деле, имхо, это извращение :) у тебя теряется нормальная логика программы. А если еще потоки будут? а еще еще сообщения должен поток посылать..
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Napalm
Сообщения: 46
Зарегистрирован: 17 апр 2013, 11:48

Re: Урок 42. Список - ListView

Сообщение Napalm » 21 апр 2013, 16:34

Olivka писал(а):ничего не поняла. Просто добавить два слова в список можно и без потока в интерфейсе. Поток становится в очередь. Но на самом деле, имхо, это извращение :) у тебя теряется нормальная логика программы. А если еще потоки будут? а еще еще сообщения должен поток посылать..
Да вроде здесь больше ничего не намечается, но это единственный способ, которым я смог что-то сделать.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 21 апр 2013, 17:24

ну надо же как-то по-нормальному учиться. Про способ я сказала - handler-ы, это хотя бы пригодится потом))
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

kan_08
Сообщения: 39
Зарегистрирован: 11 апр 2013, 13:01

Re: Урок 42. Список - ListView

Сообщение kan_08 » 26 апр 2013, 10:22

Не могу открыть simple_list_item1.xml
Выдает ошибку:Could not open the editor: Android XML Editor cannot process this input.

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

Re: Урок 42. Список - ListView

Сообщение xr0m » 04 май 2013, 11:24

Хм... в ступоре, у листа нету values, хотя у того же ListPreference оно имеется... Как вообще работать с динамическими листами без значений? :) По id не пойдет, сортировка по алфавиту. По тексту тем более, все ж аппликации мультиязычные.

xolostyak_by
Сообщения: 18
Зарегистрирован: 02 июл 2012, 03:16

Re: Урок 42. Список - ListView

Сообщение xolostyak_by » 15 май 2013, 18:01

Подскажите пожалуйста как сделать возможность редактирования пользователем текстового элемента ListView?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 15 май 2013, 18:48

в смысле - интерфейс какой? или как реализовывается? Реализовать-то просто
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

xolostyak_by
Сообщения: 18
Зарегистрирован: 02 июл 2012, 03:16

Re: Урок 42. Список - ListView

Сообщение xolostyak_by » 15 май 2013, 19:28

Ну и интерфейс и как реализовывать.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 15 май 2013, 19:42

ну я бы сделала - по клику на элементе списка - диалог-фрагмент с элементом (любые строчки) редактируешь, ОК, затем посылаешь notify адаптеру. Все.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

xolostyak_by
Сообщения: 18
Зарегистрирован: 02 июл 2012, 03:16

Re: Урок 42. Список - ListView

Сообщение xolostyak_by » 15 май 2013, 20:56

Foenix писал(а):ну я бы сделала - по клику на элементе списка - диалог-фрагмент с элементом (любые строчки) редактируешь, ОК, затем посылаешь notify адаптеру. Все.
А для совсем новичков расскажите пожалуйста как в notify свой текст?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 15 май 2013, 21:03

нотифай - это уже потом, вначале нужно данные поменять, на которых ListView строится
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 42. Список - ListView

Сообщение Foenix » 15 май 2013, 21:05

http://startandroid.ru/ru/uroki/vse-uro ... pisej.html
урок
sAdapter.notifyDataSetChanged();
оттуда.
Но вначале нужно данные изменить! в уроке, например, добавляются.
В теме на этом уроке
viewtopic.php?f=3&t=207&p=12466#p12466
то же самое сейчас обсуждается.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

xolostyak_by
Сообщения: 18
Зарегистрирован: 02 июл 2012, 03:16

Re: Урок 42. Список - ListView

Сообщение xolostyak_by » 15 май 2013, 22:25

Foenix писал(а):http://startandroid.ru/ru/uroki/vse-uro ... pisej.html
урок
sAdapter.notifyDataSetChanged();
оттуда.
Но вначале нужно данные изменить! в уроке, например, добавляются.
В теме на этом уроке
viewtopic.php?f=3&t=207&p=12466#p12466
то же самое сейчас обсуждается.
Я просто хочу сделать так: 1. к контекстному меню добавить пункт "редактировать запись" 2. Уже по нажатию "редактировать запись" ее редактировать, вот только как редактирование сделать я не понимаю пока.

Ответить