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

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

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

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

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

Чтоб отредактировать - нужно чтоб у записи был ID. В той ветке я давала кусок кода, если у вас сходный адаптер. А вообще для редактирования лучше держать данные в базе данных и соответственно выбирать в курсор.
R.id.team

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

IlyaSolo
Сообщения: 3
Зарегистрирован: 29 май 2013, 09:22

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

Сообщение IlyaSolo » 29 май 2013, 10:07

Здравствуйте!
Как можно таблицу БД, которая имеет 4 столбца, отобразить в ListView?
Спасибо!

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 30 май 2013, 14:37

IlyaSolo писал(а):Здравствуйте!
Как можно таблицу БД, которая имеет 4 столбца, отобразить в ListView?
Спасибо!
SimpleCursorAdapter - Урок 52
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Sagittarius
Сообщения: 12
Зарегистрирован: 14 мар 2013, 16:23

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

Сообщение Sagittarius » 06 июн 2013, 14:59

Сделал самую простую реализацию ListView с помощью своего ArrayAdapter. Таков вопрос: почему его методы вызываются такое дикое количество раз: getCount - 9, getItemId - 2, getView - 15, getItem - 15? Всего в массиве 5 элементов, но при этом развертывание каждого элемента происходит по 3 раза, причем значение convertView вообще не поддаётся моей логике..

Код: Выделить всё

14:45:53.796: getCount#1
14:45:53.796: getCount#2
14:45:53.796: getCount#3
14:45:53.796: getItemId#1, position =0
14:45:53.796: getItemId#2, position =0
14:45:53.827: getCount#4
14:45:53.827: getCount#5
14:45:53.827: getView#1, position =0
14:45:53.827: getView#1, convertView == null, inflate...
14:45:53.836: getView#1, findViewById
14:45:53.836: getItem#1, position =0
14:45:53.836: getView#1, setText: <<111>>
14:45:53.836: getView#1, text is set
14:45:53.836: getView#2, position =1
14:45:53.836: getView#2, convertView is not null!
14:45:53.846: getView#2, findViewById
14:45:53.846: getItem#2, position =1
14:45:53.846: getView#2, setText: <<222>>
14:45:53.846: getView#2, text is set
14:45:53.846: getView#3, position =2
14:45:53.846: getView#3, convertView is not null!
14:45:53.846: getView#3, findViewById
14:45:53.846: getItem#3, position =2
14:45:53.846: getView#3, setText: <<333>>
14:45:53.846: getView#3, text is set
14:45:53.846: getView#4, position =3
14:45:53.846: getView#4, convertView is not null!
14:45:53.846: getView#4, findViewById
14:45:53.856: getItem#4, position =3
14:45:53.856: getView#4, setText: <<444>>
14:45:53.856: getView#4, text is set
14:45:53.856: getView#5, position =4
14:45:53.856: getView#5, convertView is not null!
14:45:53.856: getView#5, findViewById
14:45:53.856: getItem#5, position =4
14:45:53.856: getView#5, setText: <<555>>
14:45:53.856: getView#5, text is set
14:45:53.926: getCount#6
14:45:53.926: getView#6, position =0
14:45:53.926: getView#6, convertView is not null!
14:45:53.926: getView#6, findViewById
14:45:53.926: getItem#6, position =0
14:45:53.926: getView#6, setText: <<111>>
14:45:53.926: getView#6, text is set
14:45:53.926: getView#7, position =1
14:45:53.926: getView#7, convertView == null, inflate...
14:45:53.936: getView#7, findViewById
14:45:53.936: getItem#7, position =1
14:45:53.946: getView#7, setText: <<222>>
14:45:53.946: getView#7, text is set
14:45:53.946: getView#8, position =2
14:45:53.946: getView#8, convertView == null, inflate...
14:45:53.946: getView#8, findViewById
14:45:53.946: getItem#8, position =2
14:45:53.946: getView#8, setText: <<333>>
14:45:53.946: getView#8, text is set
14:45:53.956: getView#9, position =3
14:45:53.956: getView#9, convertView == null, inflate...
14:45:53.956: getView#9, findViewById
14:45:53.956: getItem#9, position =3
14:45:53.956: getView#9, setText: <<444>>
14:45:53.956: getView#9, text is set
14:45:53.956: getView#10, position =4
14:45:53.966: getView#10, convertView == null, inflate...
14:45:53.966: getView#10, findViewById
14:45:53.966: getItem#10, position =4
14:45:53.966: getView#10, setText: <<555>>
14:45:53.966: getView#10, text is set
14:45:53.997: getCount#7
14:45:53.997: getCount#8
14:45:53.997: getView#11, position =0
14:45:53.997: getView#11, convertView == null, inflate...
14:45:53.997: getView#11, findViewById
14:45:53.997: getItem#11, position =0
14:45:54.006: getView#11, setText: <<111>>
14:45:54.006: getView#11, text is set
14:45:54.006: getView#12, position =1
14:45:54.006: getView#12, convertView is not null!
14:45:54.006: getView#12, findViewById
14:45:54.006: getItem#12, position =1
14:45:54.006: getView#12, setText: <<222>>
14:45:54.006: getView#12, text is set
14:45:54.006: getView#13, position =2
14:45:54.006: getView#13, convertView is not null!
14:45:54.016: getView#13, findViewById
14:45:54.016: getItem#13, position =2
14:45:54.016: getView#13, setText: <<333>>
14:45:54.016: getView#13, text is set
14:45:54.016: getView#14, position =3
14:45:54.016: getView#14, convertView is not null!
14:45:54.016: getView#14, findViewById
14:45:54.016: getItem#14, position =3
14:45:54.016: getView#14, setText: <<444>>
14:45:54.016: getView#14, text is set
14:45:54.016: getView#15, position =4
14:45:54.016: getView#15, convertView is not null!
14:45:54.026: getView#15, findViewById
14:45:54.026: getItem#15, position =4
14:45:54.026: getView#15, setText: <<555>>
14:45:54.026: getView#15, text is set
14:45:54.026: getCount#9
Вот собственно весь код:

[syntax=java]public class MainActivity extends Activity {

static final String TAG="test";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ListView elvMain = (ListView) findViewById(R.id.listView1);
elvMain.setAdapter(new MyArrayAdapter(MainActivity.this, new Integer[]{111,222,333,444,555}));

}

public class MyArrayAdapter extends ArrayAdapter<Integer> {
private Integer[] value;
private Context context;
private static final int resource = android.R.layout.simple_list_item_1;
private static final int textViewResourceId = android.R.id.text1;
int iterGetCount = 0,
iterGetItemId = 0,
iterGetItem = 0,
iterGetView =0;

public MyArrayAdapter(Context context, Integer[] value) {
super(context, resource, textViewResourceId, value);
this.context = context;
this.value = value;
}

@Override
public int getCount(){
iterGetCount++;
Log.d(TAG, "getCount#"+iterGetCount);
return value.length;

}
@Override
public long getItemId (int position){
iterGetItemId++;
Log.d(TAG, "getItemId#"+iterGetItemId+", position ="+position);
return position;
}

@Override
public Integer getItem(int position){
iterGetItem++;
Log.d(TAG, "getItem#"+iterGetItem+", position ="+position);
return value[position];

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
iterGetView++;
Log.d(TAG, "getView#"+iterGetView+", position ="+position);

LayoutInflater layoutInflater = ((Activity) context).getLayoutInflater();
View view = convertView;
if (convertView==null) {
Log.d(TAG, "getView#"+iterGetView+", convertView == null, inflate...");
view = layoutInflater.inflate(resource, null, false);
} else
Log.d(TAG, "getView#"+iterGetView+", convertView is not null!");
Log.d(TAG, "getView#"+iterGetView+", findViewById");
TextView tv = (TextView)view.findViewById(textViewResourceId);
String itemtext = getItem(position).toString();
Log.d(TAG, "getView#"+iterGetView+", setText: <<" + itemtext+">>");
tv.setText(itemtext);
Log.d(TAG, "getView#"+iterGetView+", text is set");

return view;
}
}
}[/syntax]

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

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

Сообщение Foenix » 06 июн 2013, 15:45

Посмотрите на сайте девелоперов как реализован список - все поймете. Ваш пример не показателен, нужно сравнивать вызываемое количество раз для разных длин списков. Т.к. может оказаться что 15 раз для списка в три строки и 15 раз для списка из 10тыс строк - это вполне даже ничего, хотя мне считать в голову не приходило))
R.id.team

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

Sagittarius
Сообщения: 12
Зарегистрирован: 14 мар 2013, 16:23

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

Сообщение Sagittarius » 06 июн 2013, 16:22

Foenix писал(а):Посмотрите на сайте девелоперов как реализован список - все поймете. Ваш пример не показателен, нужно сравнивать вызываемое количество раз для разных длин списков. Т.к. может оказаться что 15 раз для списка в три строки и 15 раз для списка из 10тыс строк - это вполне даже ничего, хотя мне считать в голову не приходило))
М-да, совсем не подумал, что адаптер "раздувает" только помещающиеся на экран пункты списка. У меня с деволтным лаером помещается 7, поэтому закономерность троекратного вызова getView (getItem) сохраняется вплоть до 7-го элемента. Потом уже идет +1 вызов по мере скрола.

ЗЫ. С удовольствием почитал бы подробное описание как идёт разворачивание списка, что за чем вызывается, какие методы и т.п., только вот где конкретно на сайте девелоперов это найти? Описания метода getView в ArrayAdapter я например не нашёл тут: http://developer.android.com/reference/ ... ViewGroup)

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

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

Сообщение Foenix » 06 июн 2013, 16:48

не знаю, я видео смотрела
R.id.team

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

Sagittarius
Сообщения: 12
Зарегистрирован: 14 мар 2013, 16:23

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

Сообщение Sagittarius » 07 июн 2013, 12:22

Хоть аудио-книгу, главное чтоб там были описаны подробно все механизмы, которые работают при заполнении listview.
Потому как, например, если я запишу в методе getview вместо:
[syntax=java]tv.setText(getItem(position).toString());[/syntax]
такой код:
[syntax=java]tv.setText(tv.getText() + getItem(position).toString());[/syntax]
результат окажется непредсказуемым...

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

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

Сообщение Foenix » 07 июн 2013, 13:09

что-то я не пойму, вначале ты говоришь о количестве вызываемых методов, а теперь про действия со строками..
Цель этого всего в чем? припереть разрабочиков к стенке? ))
R.id.team

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

Sagittarius
Сообщения: 12
Зарегистрирован: 14 мар 2013, 16:23

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

Сообщение Sagittarius » 07 июн 2013, 15:27

Действия со строками тут не играют никакого значения. Вместо присваивания textview "нового" текста в примере выше я этот "новый" текст просто дописываю к старому.
И написал я пример выше чтобы показать, в каком случае многократное заполнение одного и того же textview может вредить программе.
Я собственно и обратился к самому простому адаптеру чтобы хорошо понять принцип работы адаптеров. А тут оказалось всё очень запутано...

ЗЫ. И если я не могу понять, как работает самый простой адаптер, как мне делать рекурсивные (вложенные) адаптеры...

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

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

Сообщение Foenix » 07 июн 2013, 15:57

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

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

Sagittarius
Сообщения: 12
Зарегистрирован: 14 мар 2013, 16:23

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

Сообщение Sagittarius » 07 июн 2013, 16:29

Я и НЕ обвиняю разработчиков в нелогичности реализации arrayadapter или listview. Уверен, что они далеко не дураки, и каждый вызов какого-либо метода чем-то обусловлен... Но мне бы хотелось узнать, чем!
Пока нашел вот такое описание методов arrayadapter: http://grepcode.com/file/repository.gre ... .java?av=f
Но особого просветления пока нет... Вероятно, нужно изучать сам listview...

Sagittarius
Сообщения: 12
Зарегистрирован: 14 мар 2013, 16:23

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

Сообщение Sagittarius » 11 июн 2013, 15:12

Я, конечно, извиняюсь за назойливость...
Но неужели здесь никто не знает и никому не интересно, почему развертывание каждого элемента при первой отрисовке происходит по 3 раза?

[syntax=java]14:49:50.878: getView#1, position = 0: convertView == null, inflate newview = TextView@4051f408, newtext = "0"
14:49:50.878: getView#2, position = 1: convertView = TextView@4051f408 oldtext: "0", newtext = "1"
14:49:50.898: getView#3, position = 2: convertView = TextView@4051f408 oldtext: "1", newtext = "2"
14:49:50.898: getView#4, position = 3: convertView = TextView@4051f408 oldtext: "2", newtext = "3"
14:49:50.910: getView#5, position = 4: convertView = TextView@4051f408 oldtext: "3", newtext = "4"
14:49:50.918: getView#6, position = 5: convertView = TextView@4051f408 oldtext: "4", newtext = "5"
14:49:50.918: getView#7, position = 6: convertView = TextView@4051f408 oldtext: "5", newtext = "6"

14:49:50.988: getView#8, position = 0: convertView = TextView@4051f408 oldtext: "6", newtext = "0"
14:49:50.988: getView#9, position = 1: convertView == null, inflate newview = TextView@405251a8, newtext = "1"
14:49:51.188: getView#10, position = 2: convertView == null, inflate newview = TextView@405262e0, newtext = "2"
14:49:51.188: getView#11, position = 3: convertView == null, inflate newview = TextView@40527430, newtext = "3"
14:49:51.188: getView#12, position = 4: convertView == null, inflate newview = TextView@40528580, newtext = "4"
14:49:51.188: getView#13, position = 5: convertView == null, inflate newview = TextView@405296d0, newtext = "5"
14:49:51.197: getView#14, position = 6: convertView == null, inflate newview = TextView@4052a820, newtext = "6"

14:49:51.227: getView#15, position = 0: convertView == null, inflate newview = TextView@4052c1c8, newtext = "0"
14:49:51.227: getView#16, position = 1: convertView = TextView@4052c1c8 oldtext: "0", newtext = "1"
14:49:51.227: getView#17, position = 2: convertView = TextView@4052c1c8 oldtext: "1", newtext = "2"
14:49:51.227: getView#18, position = 3: convertView = TextView@4052c1c8 oldtext: "2", newtext = "3"
14:49:51.227: getView#19, position = 4: convertView = TextView@4052c1c8 oldtext: "3", newtext = "4"
14:49:51.227: getView#20, position = 5: convertView = TextView@4052c1c8 oldtext: "4", newtext = "5"
14:49:51.227: getView#21, position = 6: convertView = TextView@4052c1c8 oldtext: "5", newtext = "6"[/syntax]

Rix
Сообщения: 10
Зарегистрирован: 12 авг 2013, 09:06

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

Сообщение Rix » 14 авг 2013, 14:58

Скажите плиз, как создать список и к каждому элементу из списка присвоить конкретный свой ИД?
например с сервера гружу данные, которым является список состоящий из ИД и заголовка, мне нужно "загнать" их в ListView. Заранее спасибо!

Volha
Сообщения: 61
Зарегистрирован: 20 авг 2012, 17:39

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

Сообщение Volha » 14 авг 2013, 17:00

Rix писал(а):Скажите плиз, как создать список и к каждому элементу из списка присвоить конкретный свой ИД?
например с сервера гружу данные, которым является список состоящий из ИД и заголовка, мне нужно "загнать" их в ListView. Заранее спасибо!
1. Можно завести 2 массива, в первом - заголовки, создать из него ListView, во втором - ИД. При клике на элемент списка получаете позицию - смотрите в массив с ИД.
2. Можно написать свой адаптер с блэкджэком и любыми данными на вход/выход ;). Урок 54.

Rix
Сообщения: 10
Зарегистрирован: 12 авг 2013, 09:06

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

Сообщение Rix » 15 авг 2013, 08:03

Volha писал(а): 1. Можно завести 2 массива, в первом - заголовки, создать из него ListView, во втором - ИД. При клике на элемент списка получаете позицию - смотрите в массив с ИД.
2. Можно написать свой адаптер с блэкджэком и любыми данными на вход/выход ;). Урок 54.
Cпасибо

krava
Сообщения: 1
Зарегистрирован: 23 авг 2013, 16:28

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

Сообщение krava » 23 авг 2013, 16:43

Здравствуйте! Спасибо за уроки! У меня возник вопрос, который мне новичку не удается решить.
У вас в примере формируется массив имен, который мы позже используем в списке
String[] names = { "Иван", "Марья", "Петр", "Антон", "Даша", "Борис",
"Костя", "Игорь", "Анна", "Денис", "Андрей" };

У меня имена хранятся в базе данных SQL, я их от туда вытаскиваю благодаря уроку №34.
Но вот сформировать массив имен налету у меня почему-то не получается - ошибки разные выдает.
Вот пример кода:
int i = 0;
String[] masName = null;
do {
masName = c.getString(nameColIndex); // на этой строчке приложение вылетает
i++;
} while (c.moveToNext());


Подскажите что я неправильно делаю?
Может есть какой-то другой (оптимальный,красивый) путь? Не формировать массив, а сразу передать адаптеру данные?

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

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

Сообщение Foenix » 23 авг 2013, 17:00

конечно, нужно сразу
урок 52
R.id.team

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

Venya
Сообщения: 10
Зарегистрирован: 17 авг 2013, 14:12

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

Сообщение Venya » 24 авг 2013, 18:27

Foenix здравствуйте!!! Извините что не в тему, но я не знаю к кому обратиться :D
Короче проблема такая:

У меня рекурсивная функция, на вход подается TAG в котором содержится 3 переменных, примерно такой тег: myTag[] = {bred, x , y}
Первый раз, когда я ищу по этому Тэгу Кнопку, всё нормально находится, но когда изменяю тег, чтобы опять войти в эту функцию и найти другую кнопу, она не находится, хотя кнопка с таким тегом точно существует =\

[syntax=java]private void Pysto(int x, int y, int TagToInt[]) {
int i,j,x2,y2;

Button btnOldNew = new Button(this); // Создаем кнопку

btnOldNew = (Button) LCenter.findViewWithTag (TagToInt); //Находим кнопу из Layoutа по Тегу!!


Drawable background = this.getResources().getDrawable(R.drawable.new_open); //ниже операции с кнопкой
btnOldNew.setBackgroundDrawable(background);
btnOldNew.setEnabled(false);
btnOldNew.setId(0);
MassPole[x][y]=' '; //выше операции с кнопкой


for (i=x-1;i<=x+1;i++)
for (j=y-1;j<=y+1;j++)
if (MassPole[j]== tagPysto)
{
x2=i; //нашли новые координаты для кнопки
y2=j;
int TagToInt2[] = {tagNoBomb, x2,y2}; //создали тег с нужными координатами
Pysto(x2,y2,TagToInt2); // рекурсируемся (И далее ищем еще одну кнопку уже с новым Тегом)
}
}
}[/syntax]

Может знаете в чем проблема?

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

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

Сообщение Foenix » 24 авг 2013, 22:50

мне кажется, что у тебя совершенно неверно построена эта "рекурсия" и она там нафиг не нужна.
Баттоны можно занести в массив, и перебирать их
тут несколько тем уже на эту тему было
viewtopic.php?f=33&t=2347
а так же по поиску по слову "перебор"
если же этот способ тебе почему-то не подойдет, то нужно воспользоваться отладчиком, или хотя бы выводить в логи почти каждый шаг и то, что ищется в цикле, так поймешь, в чем там твоя логика неверная.
R.id.team

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

Ответить