Страница 7 из 8

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

Добавлено: 10 апр 2014, 18:32
vapsel
siberprogs писал(а): Странно.
массивы...неодинаковое количество элементов)))

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

Добавлено: 14 май 2014, 14:30
vonegosh
Вопрос, на который я нигде не нашел ответ. Касается события в 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 и т.д.

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

Добавлено: 14 май 2014, 14:46
Foenix
а зачем так делать, если есть http://startandroid.ru/ru/uroki/vse-uro ... anija.html

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

Добавлено: 14 май 2014, 14:59
vonegosh
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 знаком, просто не понял сути и когда его вызывать

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

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

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

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

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

Добавлено: 14 май 2014, 17:25
Foenix
почему не получается? уроки тут есть, делай все по ним.

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

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

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

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

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

Добавлено: 02 июл 2014, 18:33
Stormer
Я правильно понимаю, что все элементы списка держатся в оперативке? А как загружать в оперативу только те данные, которые видны непосредственно на экране? А остальное хранить в кеше на диске допустим? Есть какие таториалы или урок по этому?

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

Добавлено: 02 июл 2014, 19:26
Foenix
Stormer писал(а):Я правильно понимаю, что все элементы списка держатся в оперативке? А как загружать в оперативу только те данные, которые видны непосредственно на экране? А остальное хранить в кеше на диске допустим? Есть какие таториалы или урок по этому?
нет. В оперативке находятся только видимые элементы плюс два - верхний и нижний невидимые.

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

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

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

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

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

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

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

Добавлено: 03 июл 2014, 22:00
Foenix
ой, ну тогда тебе понравится. И понять там не сложно - они ж почти все иностранцы у них, поэтому хотя у всех и акценты, но понять их проще даже.

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

Добавлено: 21 авг 2014, 11:04
Vovich
Я так понимаю, что на реальном устройстве (без мышки и клавиатуры и т.д.) OnItemSelectedListener не работает?

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

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

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

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

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

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

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

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

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

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, мне кажется это приятнее.
Простите за мой дилетантский лексикон - "циклы". Понимаю, что там циклами и не пахнет, просто писал это ночью. Да чего я отмазываюсь...нуб я.
В упор не вижу, что не так во всем коде. Никаких ошибок, ничего, за что можно было бы зацепиться и копать, просто обработчик пропускает все условия и вызывает последнее активити. Святой гугл не помогает уже сутки.

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

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

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

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'у и надо было - цифроядный он.
Я молодец?