Урок 44. События в ListView

Обсуждение уроков
vapsel
Сообщения: 16
Зарегистрирован: 23 мар 2014, 00:23

Re: Урок 44. События в ListView

Сообщение vapsel » 10 апр 2014, 18:32

siberprogs писал(а): Странно.
массивы...неодинаковое количество элементов)))

vonegosh
Сообщения: 3
Зарегистрирован: 14 май 2014, 14:16

Re: Урок 44. События в ListView

Сообщение vonegosh » 14 май 2014, 14:30

Вопрос, на который я нигде не нашел ответ. Касается события в ListView onItemClickListener. В качестве адаптера использую simpleCursorAdapter. Мне нужно сгенерировать график платежей, по нажатию на item нужно найти во view нажатого пункта списка спрятанный layout с атрибутом Visibility:gone и сделать его видимым. То есть типа выпадающий пояснительный список. Вот код

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

@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		// TODO Auto-generated method stub

		
		LinearLayout lsubitem = (LinearLayout) view.findViewById(R.id.lsubitem);

		if (lsubitem.getVisibility() == View.GONE) {
			lsubitem.setVisibility(View.VISIBLE);

		} else {

			lsubitem.setVisibility(View.GONE);

		}
Загвоздка вот в чем.
1) Допустим сгенерировалось 50 пунктов в listview, из них 10 помещается на экране. Когда я нажимаю на какой-либо пункт, например, 1-ый пункт, то он делает видимыми и 11, 21, 31, 41 - пункты. Почему так происходит?
2) также если резко прокрутить вниз или вверх список, то сбивается порядок. То есть выбрал я 1ый пунк - открылись помимо 1 еще 11, 21, 31 и т.д потом прокрутил резко вниз и они стали 3, 13, 23, 33 и т.д.

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

Re: Урок 44. События в ListView

Сообщение Foenix » 14 май 2014, 14:46

а зачем так делать, если есть http://startandroid.ru/ru/uroki/vse-uro ... anija.html
R.id.team

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

vonegosh
Сообщения: 3
Зарегистрирован: 14 май 2014, 14:16

Re: Урок 44. События в ListView

Сообщение vonegosh » 14 май 2014, 14:59

Foenix писал(а):а зачем так делать, если есть http://startandroid.ru/ru/uroki/vse-uro ... anija.html
Дело в том, что там заголовок берется из массива String, а я item.xml.

В общем представьте график платежей, таблицу, состоящий из полей "дата" "баланс" "платеж". в item.xml 3 Textview, где с помощью адаптера заполняется listview из БД. Мне надо на нажатие пункта списка "выпадал" невидимый layout где содержится какая-либо дополнительная информация по платежу. Мне ответили в другом месте так: "потому что нужно обновлять в getView и подобных методах. ListView кеширует элементы, когда Вы прокручиваете, то те элементы, которые "ушли с поля видимости" подсовываются с другой стороны. Если в getView их не обновить правильно (не обновить все поля), то они будут в "странном состоянии".
Вывод. onItemClick должен указывать адаптеру новое состояние и вызывать обновление списка (notifyDataChange)."

Разъясните, пожалуйста) с notifyDataChange знаком, просто не понял сути и когда его вызывать

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

Re: Урок 44. События в ListView

Сообщение Foenix » 14 май 2014, 16:02

я не вижу противоречия с тем, что я предложила
однако вообще не поняла того, что вам где-то объяснили.
Что же касается отдельно от всего прочего "невидимого лэйаута" - то по-моему вы изобретаете велосипед. Информацию по платежу вот я вот лично выводила бы просто в диалоговом окошке, который появлялся по клику на пункт простого списка, к примеру. Зачем невидимый-то? так не делают.
либо еще раз повторяю - ты задумал что-то типа дерева, там тоже "выпадает". Делай ему кастомную строчку и хоть картинки хоть 100500 текствью там отображай.
R.id.team

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

vonegosh
Сообщения: 3
Зарегистрирован: 14 май 2014, 14:16

Re: Урок 44. События в ListView

Сообщение vonegosh » 14 май 2014, 17:16

Foenix писал(а):я не вижу противоречия с тем, что я предложила
однако вообще не поняла того, что вам где-то объяснили.
Что же касается отдельно от всего прочего "невидимого лэйаута" - то по-моему вы изобретаете велосипед. Информацию по платежу вот я вот лично выводила бы просто в диалоговом окошке, который появлялся по клику на пункт простого списка, к примеру. Зачем невидимый-то? так не делают.
либо еще раз повторяю - ты задумал что-то типа дерева, там тоже "выпадает". Делай ему кастомную строчку и хоть картинки хоть 100500 текствью там отображай.
Если бы Вы подсказали, как сделать ему кастомную строчку, был бы крайне признателен, потому что у меня не получается

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

Re: Урок 44. События в ListView

Сообщение Foenix » 14 май 2014, 17:25

почему не получается? уроки тут есть, делай все по ним.
R.id.team

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

webdirect
Сообщения: 3
Зарегистрирован: 29 дек 2013, 00:52

Re: Урок 44. События в ListView

Сообщение webdirect » 26 май 2014, 11:48

Добрый день. Есть вопрос, нигде не нашел ответа. Перерыл темы с кастомным адаптером и ListView.

На данный момент есть адаптер, наследуемый от BaseAdapter.

Есть список (ListView), когда я скролю его вниз, отрабатывает анимация и нижний элемент (item) выплывает нужным мне образом (анимацию реализовал). Но мне, так же, нужно чтобы верхний элемент “заплывал” тоже, с определенной анимацией. Как это реализовать? Как обратится к верхнему элементу во время скролла вниз? То есть, когда я скролю открывется новый элемент, position становится = 6, например (и анимация отрабатывает), но при этом одновременно должна происходить анимация элемента с position = 0, который прячется за видимую область. Надеюсь, понятно пояснил.

Stormer
Сообщения: 39
Зарегистрирован: 13 сен 2013, 20:18

Re: Урок 44. События в ListView

Сообщение Stormer » 02 июл 2014, 18:33

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

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

Re: Урок 44. События в ListView

Сообщение Foenix » 02 июл 2014, 19:26

Stormer писал(а):Я правильно понимаю, что все элементы списка держатся в оперативке? А как загружать в оперативу только те данные, которые видны непосредственно на экране? А остальное хранить в кеше на диске допустим? Есть какие таториалы или урок по этому?
нет. В оперативке находятся только видимые элементы плюс два - верхний и нижний невидимые.
R.id.team

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

Stormer
Сообщения: 39
Зарегистрирован: 13 сен 2013, 20:18

Re: Урок 44. События в ListView

Сообщение Stormer » 03 июл 2014, 11:34

Foenix писал(а):нет. В оперативке находятся только видимые элементы плюс два - верхний и нижний невидимые.
Вы уверены?? Т.е. такая вот простая процедура, чтобы реализовать это всё через адаптер? Я думал, там сложнее будет намного. Спасибо! )

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

Re: Урок 44. События в ListView

Сообщение Foenix » 03 июл 2014, 11:37

Stormer писал(а):
Foenix писал(а):нет. В оперативке находятся только видимые элементы плюс два - верхний и нижний невидимые.
Вы уверены?? Т.е. такая вот простая процедура, чтобы реализовать это всё через адаптер? Я думал, там сложнее будет намного. Спасибо! )
Своими ушами слышала от разработчика из гугла :mrgreen:
Вы, кстати, смотрите видео с гугл IO, там много интересного разъясняют. Правда, язык нужно знать..
R.id.team

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

Stormer
Сообщения: 39
Зарегистрирован: 13 сен 2013, 20:18

Re: Урок 44. События в ListView

Сообщение Stormer » 03 июл 2014, 16:22

Да, пожалуй стоит. У меня upper intermediate. Тесты сдавал. Так что что-нибудь да пойму :D

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

Re: Урок 44. События в ListView

Сообщение Foenix » 03 июл 2014, 22:00

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

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

Vovich
Сообщения: 30
Зарегистрирован: 30 май 2013, 15:03

Re: Урок 44. События в ListView

Сообщение Vovich » 21 авг 2014, 11:04

Я так понимаю, что на реальном устройстве (без мышки и клавиатуры и т.д.) OnItemSelectedListener не работает?

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 44. События в ListView

Сообщение Irrumator » 20 окт 2014, 19:55

Ппц, до чего злое это занятие - уже 2 часа ночи а мне на работу через 4 часа =/
Даже когда задротил по молодости, такого не было.
А засиделся я вот изза какой проблемы:
Суть приложения: Пользователь сам заполняет список. Нажимает на кнопочку Add, вылазит диалог, где пользователь выбирает дату. И создается пункт списка, содержащий в названии эту дату.
Теперь нужно, чтобы при нажатии на пункт списка открывался один из нескольких активити, по определённой зависимости.
И вот проблема - по ид элемента из БД никак не получится организовать вызов нужного активити - ведь приложение не знает, какую дату пользователь присвоил данному ид. Хочу, чтобы нужное активити вызывалось в зависимости от названия пункта списка( то есть по текстовому полю из БД).
Помогайте, как реализовать подобное?)

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 44. События в ListView

Сообщение Irrumator » 20 окт 2014, 20:00

SСобственно не могу найти, можно ли в switch передать строку?
if/else пробовал, ничего не вышло, onItemClick словно не видит этих циклов.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 44. События в ListView

Сообщение klblk » 21 окт 2014, 08:17

1) вы что-то делаете не так.
2) switch по строкам появился в java 7 (поддерживается Android, можно поменять в настройках проекта)
3) if/else не циклы, вероятно вы не правильно сравниваете строки.

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 44. События в ListView

Сообщение Irrumator » 21 окт 2014, 12:21

Будьте добры, посмотрите, возможно я не правильно сравниваю строки или еще что.
Надеюсь код не криво вставится =/

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

SpisokTablitsMes.setOnItemClickListener(new OnItemClickListener() {
      public void onItemClick(AdapterView<?> parent, View view,
          int position, long id) {
    	  cursor.moveToPosition(position);
    	  String mesyac = cursor.getString(cursor.getColumnIndex("month"));

    	  Log.d(LOG_TAG, "itemClick: position = " + position + ", id = "
  	            + id + ",месяц = " + mesyac);

    	  if(mesyac == "Январь"||mesyac == "Март"||mesyac == "Май"){
    	  Intent intent1 = new Intent(MainActivity.this, tabl1.class);
    	  startActivity(intent1);
    	  ;}
    	  else if (mesyac == "Апрель"||mesyac == "Июнь"){
    	  Intent intent2 = new Intent(MainActivity.this, tabl2.class);
          startActivity(intent2);
          ;}
          else {
    	  Intent intent4 = new Intent(MainActivity.this, tabl4.class);
    	  startActivity(intent4);
    	  ;}
      }
    });
Вот, в итоге, по логам если посмотреть, Активити вообще пропускает всё, что идёт под знаком if, и запускает всегда 3-е активити. В заголовках списка ошибок нет.
А в логе, причем, выводится строка с именем элемента списка, как положено.

Очень хотелось бы реализовать именно на If/else, мне кажется это приятнее.
Простите за мой дилетантский лексикон - "циклы". Понимаю, что там циклами и не пахнет, просто писал это ночью. Да чего я отмазываюсь...нуб я.
В упор не вижу, что не так во всем коде. Никаких ошибок, ничего, за что можно было бы зацепиться и копать, просто обработчик пропускает все условия и вызывает последнее активити. Святой гугл не помогает уже сутки.

Irrumator
Сообщения: 25
Зарегистрирован: 08 окт 2014, 16:39

Re: Урок 44. События в ListView

Сообщение Irrumator » 21 окт 2014, 13:19

Всемогущий Гугл откликнулся на мои молитвы.
Вобщем, верный код выглядит так (может попадётся второй такой же бедолага, как я):

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

SpisokTablitsMes.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
          int position, long id) { 
          cursor.moveToPosition(position); 
          String mesyac = cursor.getString(cursor.getColumnIndex("month")); 
 
          Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " 
                  + id + ",месяц = " + mesyac); 
 
          if(mesyac.equals("Январь")||mesyac.equals("Март")||mesyac.equals("Май")){ 
          Intent intent1 = new Intent(MainActivity.this, tabl1.class); 
          startActivity(intent1); 
          ;} 
          else if (mesyac.equals("Апрель")||mesyac.equals("Июнь")){ 
          Intent intent2 = new Intent(MainActivity.this, tabl2.class); 
          startActivity(intent2); 
          ;} 
          else { 
          Intent intent4 = new Intent(MainActivity.this, tabl4.class); 
          startActivity(intent4); 
          ;} 
      } 
    }); 
копипастнуть то я копипастнул, теперь нужно разбираться в сути этого фокуса =/

И да...спасибо за наводку
вероятно вы не правильно сравниваете строки
Чтобы не флудить в теме, допишу в этом посту свои догадки по поводу произошедшего.
Так как if/else не кушает строки, то мы сравниваем значение строки mesyac с текстом "Месяц" с помощью оператора equals. И на выходе уже имеем бульку 1/0, которую if'у и надо было - цифроядный он.
Я молодец?

Ответить