Страница 2 из 5

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

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

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

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

Этим посредником является адаптер. А различаются адаптеры тем, что работают с разными типами и комбинациями данных.

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

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

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

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

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

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

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

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

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

Добавлено: 06 ноя 2012, 21:57
Jersey
Срочно при срочно нужна помощь по 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);

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

Добавлено: 06 ноя 2012, 22:49
Foenix
Нужно переопределить метод setOnItemLongClickListener(new OnItemLongClickListener(){}
вашего списка listview
либо setOnItemClickListener для короткого нажатия

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

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

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 можно будет менять !не в методе обработки клика, а в самом вызваном активити. но тут другой вопрос, как передавать вызываемому активити какой пункт меню был нажат.

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

Добавлено: 06 ноя 2012, 23:42
Foenix
Сейчас вас попросят сообщение об ошибке сюда опубликовать.

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

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

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

Добавлено: 06 ноя 2012, 23:59
Jersey
intent.putExtra("position", position);
intent.putExtra("id", id);
так передаю id и позицию.
как принять теперь?

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

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

Добавлено: 07 ноя 2012, 00:00
Foenix
текст ошибки находится в LogCat

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

Добавлено: 07 ноя 2012, 00:02
Foenix
int id = intent.getIntExtra("id",-1);
тебе надо добавить значение по-умолчанию, например. -1

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

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

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

Добавлено: 07 ноя 2012, 00:11
Jersey
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 все равно не меняется. (

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

Добавлено: 07 ноя 2012, 00:13
Jersey
int id = intent.getIntExtra("id",-1);
tvView.setText("выбран: " + id);

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

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

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

Добавлено: 07 ноя 2012, 00:36
Foenix
http://www.vr-online.ru/content/znakoms ... rmami-2827
тут сравни что именно ты делаешь..

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

Добавлено: 07 ноя 2012, 10:45
rezak90
Olivka писал(а):Сейчас вас попросят сообщение об ошибке сюда опубликовать.
наверное это фраза въелась от меня :?

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

Добавлено: 27 ноя 2012, 02:39
nubodroid
Всем салют!!!

Я уже тут достал всех со своим 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 и красота.

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

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

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

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