Урок 48. Используем SimpleAdapter.

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

Re: Урок 48. Используем SimpleAdapter.

Сообщение damager82 » 28 сен 2012, 13:24

Overdos писал(а):Всем привет! Скажите плиз...Что такое Адаптер , только как можно проще)) и для чего он нужен и пример его использования в программах ! Спасибо )
Дано:
Числа: 1,2,3,4,5.
ListView (список), который умеет показывать вертикальный ряд, составленный из View (пункты списка).

Требуется:
ListView должен отобразить числа 1,2,3,4,5.

Решение:
ListView не поймет что от него хотят, если дать ему просто числа. Он воспринимает только уже готовые View, показывает их, позволяет прокручивать, нажимать и прочее. Соответственно нужен посредник, который возьмет числа и сделает из них View и передаст в ListView на отображение.

Этим посредником является адаптер. А различаются адаптеры тем, что работают с разными типами и комбинациями данных.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 24 окт 2012, 20:46

Решила потренироваться и сделала все как по уроку, за одним исклчением, MAP объявляла как в этом примере http://shenhengbin.wordpress.com/2012/0 ... leadapter/
Вроде все получилось, но..
1. когда я отмечаю элементы, то клик воспринимается только по чекбосу - можно ли это изменить, чтоб по всей строке можно было кликнуть?
2. при прокручивании списка галочки снимаются сами по себе..
R.id.team

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

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 48. Используем SimpleAdapter.

Сообщение AndreyI » 25 окт 2012, 00:32

Это потому что у вас чекбоксы "живут" своей жизнью, отдельно от ListView и адаптера.
Хорошая иллюстрация того, чтобы понять как работают адаптеры.
Логика работы любого адаптера везде одинакова, берем данные и отображаем их в ListView, а не наоборот, почему-то не все могут это осмыслить. Данные, которые берутся для адаптера первичны.
У чекбоксов, в отличие от других элементов, есть свое поведение (реакция на нажатие), но оно не как не связано с адаптером, об этом должен позаботится программист, перехватив нажатие на чекбокс или, как вы хотите, на весь элемент списка и внести изменение в источник данных для адаптера и дать понять адаптеру, что данные изменились только после этого у вас все будет работать правильно.

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

К примеру, вы (чекбокс) живете в доме (ListView) вышли замуж и поменяли фамилию, но чиновники об этом еще не знают, пока вы не пойдете в ЗАГС (адаптер) и не поменяете запись в госреестрах (источниках данных). Т.е., вы как бы для себя изменили свое состояние (семейный статус, фамилию), но кроме вас и вашего ближайшего окружения об этом никто знает.

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

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 25 окт 2012, 11:34

ага, я теперь вспомнила, что смотрела про это целый фильм на ютюбе, где сотрудник гугла (разработчик интерфейса) рассказывал и показывал на схеме, что та строчка, котоаря наверху при прокрутке вверх уходит и адаптер подменяет нижнюю строчку на новую, подготовленную, всеэ то сделано для скорости прокрутки. Только это было на английском, и я уловила, что мол это должен делать программист (программировать так логику). А оказывается это адаптер все делает..
После просмотра, ксатти, посмотрела что дата фильма была 2008 что ли, подумала, что это устарело все и пожалела времени на просмотр. Оказалось, что нет.
И не в тему - здоровские они, все-тки, устраивают "представления", на вопросы отвечают и все весело так.
R.id.team

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

Jersey
Сообщения: 21
Зарегистрирован: 06 ноя 2012, 21:52

Re: Урок 48. Используем SimpleAdapter.

Сообщение Jersey » 06 ноя 2012, 21:57

Срочно при срочно нужна помощь по SampleAdapter
есть списко из текствью и имейджвью. использую SampleAdapter.
как написать обработчик нажатия на пункт списка.

краткий код:

private ArrayList <HashMap<String, Object>> myBooks;
private static final String BOOKKEY = "bookname";
private static final String IMGKEY = "iconfromraw";

public void onCreate(Bundle savedInstanceState) {

ListView listView = (ListView)findViewById(R.id.list);
myBooks = new ArrayList<HashMap<String,Object>>(); //создаем массив списков

HashMap<String, Object> hm;

hm = new HashMap<String, Object>();
hm.put(BOOKKEY, "первый пунтк");
hm.put(IMGKEY, R.drawable.ic_launcher);
myBooks.add(hm);

hm = new HashMap<String, Object>();
hm.put(BOOKKEY, "второй пунтк");
hm.put(IMGKEY, R.drawable.ic_launcher);
myBooks.add(hm);

SimpleAdapter adapter = new SimpleAdapter(this,
myBooks,
R.layout.list, new String[]{
BOOKKEY,
IMGKEY
}, new int[]{
R.id.text1,
R.id.img });

listView.setAdapter(adapter);

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

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 06 ноя 2012, 22:49

Нужно переопределить метод setOnItemLongClickListener(new OnItemLongClickListener(){}
вашего списка listview
либо setOnItemClickListener для короткого нажатия
R.id.team

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

Jersey
Сообщения: 21
Зарегистрирован: 06 ноя 2012, 21:52

Re: Урок 48. Используем SimpleAdapter.

Сообщение Jersey » 06 ноя 2012, 23:26

прошлую проблему решил) Благодарю за отличные уроки. нашел решение в одном из них.
теперь появилась еще одна проблема, и последняя для данного приложения. все остальное уже реализовано.

TextView tv1;
tv1 = (TextView) findViewById(R.id.textViewPage1);

final Intent intent = new Intent(this, Page.class);

listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// Log.d(LOG_TAG, "itemSelect: position = " + position + ", id = " + id);
tv1.setTextSize(40);
startActivity(intent);
}
});

вот так обрабатываю нажатия пунктов списка. при нажатии вызываю новый активите, с лейаутом который имеет два виджета, тексвью и имейджвью.
Так же при нажатии, кроме вызова активити, хочу менять содержимое этих виджетов в активити который вызываю.
вот: tv1.setTextSize(40);
tv.setText("какой-то новый текст");

компилится успешно, но при нажатии на пункт списка, приложение закрывается с сообщением об ошибке.

Как можно менять содержимое EmageView и TextView одного активити из другого по нажатию на пунск списка? буду очень благодарен.

p.s. то есть по нажатию на пункт списка, я должен вызвать новый активити, и изменить содержимое его TextView в зависимости от id нажатого пункта меню. Если вызываемый активити получит ID нажатого пункта меню, то содержимое TextView можно будет менять !не в методе обработки клика, а в самом вызваном активити. но тут другой вопрос, как передавать вызываемому активити какой пункт меню был нажат.

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

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 06 ноя 2012, 23:42

Сейчас вас попросят сообщение об ошибке сюда опубликовать.
R.id.team

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

Jersey
Сообщения: 21
Зарегистрирован: 06 ноя 2012, 21:52

Re: Урок 48. Используем SimpleAdapter.

Сообщение Jersey » 06 ноя 2012, 23:50

разобрался уже, как передавать id пункта списка нажатого:)
но было бы интересно узнать, как же все таки изменять текствью одного активити из другого.
ошибка: sorry приложение будет закрыто, нажмите перезапустить

Jersey
Сообщения: 21
Зарегистрирован: 06 ноя 2012, 21:52

Re: Урок 48. Используем SimpleAdapter.

Сообщение Jersey » 06 ноя 2012, 23:59

intent.putExtra("position", position);
intent.putExtra("id", id);
так передаю id и позицию.
как принять теперь?

так не принимает, ошибка - не хватает аргумента типа инт после "id" а какой туда аргумент писать?
int id = intent.getIntExtra("id");

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

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 07 ноя 2012, 00:00

текст ошибки находится в LogCat
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: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 07 ноя 2012, 00:02

int id = intent.getIntExtra("id",-1);
тебе надо добавить значение по-умолчанию, например. -1
R.id.team

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

Jersey
Сообщения: 21
Зарегистрирован: 06 ноя 2012, 21:52

Re: Урок 48. Используем SimpleAdapter.

Сообщение Jersey » 07 ноя 2012, 00:03

Olivka писал(а):int id = intent.getIntExtra("id",-1);
тебе надо добавить значение по-умолчанию, например. -1
Большое спасибо :)

Jersey
Сообщения: 21
Зарегистрирован: 06 ноя 2012, 21:52

Re: Урок 48. Используем SimpleAdapter.

Сообщение Jersey » 07 ноя 2012, 00:11

int id = intent.getIntExtra("id",-1);


switch(id)
{
case 0:
tvView.setText("выбран 1 пункт");
break;
case 1:
tvView.setText("выбран 2 пункт");
break;
case 2:
tvView.setText("выбран 3 пункт");
break;
}

делаю следубщее. но TextViev все равно не меняется. (

Jersey
Сообщения: 21
Зарегистрирован: 06 ноя 2012, 21:52

Re: Урок 48. Используем SimpleAdapter.

Сообщение Jersey » 07 ноя 2012, 00:13

int id = intent.getIntExtra("id",-1);
tvView.setText("выбран: " + id);

сделал так, получается всегда -1

P.S. все, разобрался

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

Re: Урок 48. Используем SimpleAdapter.

Сообщение Foenix » 07 ноя 2012, 00:36

http://www.vr-online.ru/content/znakoms ... rmami-2827
тут сравни что именно ты делаешь..
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 48. Используем SimpleAdapter.

Сообщение rezak90 » 07 ноя 2012, 10:45

Olivka писал(а):Сейчас вас попросят сообщение об ошибке сюда опубликовать.
наверное это фраза въелась от меня :?
R.id.team
Политика на форуме запрещена

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

Re: Урок 48. Используем SimpleAdapter.

Сообщение nubodroid » 27 ноя 2012, 02:39

Всем салют!!!

Я уже тут достал всех со своим GridView. В общем... в главном layout'е у меня GridView, в шаблонах TextView и ImageView.

Все сделал как в уроке... и все получилось. Теперь пытаюсь выковырять содержимое ячеек... но максимум что могу получить так это то что у меня корневик LinearLayout либо его id.
А как можно получить значение поля Text элемента TextView? Писать свой адаптер?

У меня пока такой вот вариант

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

    // массивы данных
    String[] texts = { "Bla-bla-bla-1", "Bla-bla-bla-2", "Bla-bla-bla-3", "Bla-bla-bla-4", "Bla-bla-bla-5" };

........................................................................................................................

    gv.setOnItemClickListener(new OnItemClickListener() {

		public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
			// TODO Auto-generated method stub
			
			tv.setText("text = " + texts[position]);
			
		}
    	
	});

... но... что-то как-то он мне совсем не нравится... К тому же...я не знаю, получу ли корректные данные если проведу сортировку по имени. Т.е., скорей всего получу, т.к. сортировка все равно через массив... но хотелось бы все же выковырять из нажатой ячейки элемент TextView и из него уже потом выковырять значение поля Text, а не привязываться к индексу массива.

Как енто сделать?

Всем заранее спасибо!

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

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

..........................................................
public String GetItem(int position) 
          return mContacts[position]; 
.......................................................

Час спустя

В общем... я тут доковырялся до следующего

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

    gv.setOnItemClickListener(new OnItemClickListener() {

		public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
			// TODO Auto-generated method stub
			Object obj;

			obj = sAdapter.getItem(position);
			
			m = (HashMap)obj;

			tv.setText("Activity name = " + m.get(ATTRIBUTE_NAME_TEXT));
			
		}
    	
	});
  }
Такой вариант норм или это есть ужасно?

З.Ы. Я прошу прощения... за свою назойливость по поводу "правильно"... просто... после прочтения книг по проектированию, по оформлению кода, по паттернам и т.д.... спокойная жизнь закончилась. Раньше было спокойней... засунул все в один класс...и View и Model и Controler и красота.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 48. Используем SimpleAdapter.

Сообщение AndreyI » 27 ноя 2012, 08:15

Блин, наверное 33-й раз уже пишу :)
Для любого адаптера данные всегда первичны. Вы используете списковые View для удобного отображения этих данных, зачем вам их получать у адаптера, если вы итак их имеете и кормите ими адаптер? Что вы скормите адаптеру, то и увидите в списках. Никаких сортировок адаптер не делает, вам нужно будет соотировать массив и давать адаптеру уже отсортированные данные. Так что индексы массивов всегда будут совпадать с элементами списков.

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

Re: Урок 48. Используем SimpleAdapter.

Сообщение nubodroid » 27 ноя 2012, 12:04

AndreyI писал(а):Блин, наверное 33-й раз уже пишу :)
Для любого адаптера данные всегда первичны. Вы используете списковые View для удобного отображения этих данных, зачем вам их получать у адаптера, если вы итак их имеете и кормите ими адаптер? Что вы скормите адаптеру, то и увидите в списках. Никаких сортировок адаптер не делает, вам нужно будет соотировать массив и давать адаптеру уже отсортированные данные. Так что индексы массивов всегда будут совпадать с элементами списков.
))) Да-да... я и сам уж это понял... блин.. зря 1 час жизни убил

Ответить