Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 16 дек 2018, 22:43

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 28 сен 2012, 13:24 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Overdos писал(а):
Всем привет! Скажите плиз...Что такое Адаптер , только как можно проще)) и для чего он нужен и пример его использования в программах ! Спасибо )


Дано:
Числа: 1,2,3,4,5.
ListView (список), который умеет показывать вертикальный ряд, составленный из View (пункты списка).

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

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

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

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 24 окт 2012, 20:46 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
Решила потренироваться и сделала все как по уроку, за одним исклчением, MAP объявляла как в этом примере http://shenhengbin.wordpress.com/2012/0 ... leadapter/
Вроде все получилось, но..
1. когда я отмечаю элементы, то клик воспринимается только по чекбосу - можно ли это изменить, чтоб по всей строке можно было кликнуть?
2. при прокручивании списка галочки снимаются сами по себе..

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 25 окт 2012, 00:32 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Это потому что у вас чекбоксы "живут" своей жизнью, отдельно от ListView и адаптера.
Хорошая иллюстрация того, чтобы понять как работают адаптеры.
Логика работы любого адаптера везде одинакова, берем данные и отображаем их в ListView, а не наоборот, почему-то не все могут это осмыслить. Данные, которые берутся для адаптера первичны.
У чекбоксов, в отличие от других элементов, есть свое поведение (реакция на нажатие), но оно не как не связано с адаптером, об этом должен позаботится программист, перехватив нажатие на чекбокс или, как вы хотите, на весь элемент списка и внести изменение в источник данных для адаптера и дать понять адаптеру, что данные изменились только после этого у вас все будет работать правильно.

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 25 окт 2012, 11:34 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
ага, я теперь вспомнила, что смотрела про это целый фильм на ютюбе, где сотрудник гугла (разработчик интерфейса) рассказывал и показывал на схеме, что та строчка, котоаря наверху при прокрутке вверх уходит и адаптер подменяет нижнюю строчку на новую, подготовленную, всеэ то сделано для скорости прокрутки. Только это было на английском, и я уловила, что мол это должен делать программист (программировать так логику). А оказывается это адаптер все делает..
После просмотра, ксатти, посмотрела что дата фильма была 2008 что ли, подумала, что это устарело все и пожалела времени на просмотр. Оказалось, что нет.
И не в тему - здоровские они, все-тки, устраивают "представления", на вопросы отвечают и все весело так.

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 06 ноя 2012, 21:57 

Зарегистрирован: 06 ноя 2012, 21:52
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Срочно при срочно нужна помощь по 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 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
Нужно переопределить метод setOnItemLongClickListener(new OnItemLongClickListener(){}
вашего списка listview
либо setOnItemClickListener для короткого нажатия

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 06 ноя 2012, 23:26 

Зарегистрирован: 06 ноя 2012, 21:52
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
прошлую проблему решил) Благодарю за отличные уроки. нашел решение в одном из них.
теперь появилась еще одна проблема, и последняя для данного приложения. все остальное уже реализовано.

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 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
Сейчас вас попросят сообщение об ошибке сюда опубликовать.

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 06 ноя 2012, 23:50 

Зарегистрирован: 06 ноя 2012, 21:52
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
разобрался уже, как передавать id пункта списка нажатого:)
но было бы интересно узнать, как же все таки изменять текствью одного активити из другого.
ошибка: sorry приложение будет закрыто, нажмите перезапустить


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 06 ноя 2012, 23:59 

Зарегистрирован: 06 ноя 2012, 21:52
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
intent.putExtra("position", position);
intent.putExtra("id", id);
так передаю id и позицию.
как принять теперь?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 07 ноя 2012, 00:00 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
текст ошибки находится в LogCat

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 07 ноя 2012, 00:02 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
int id = intent.getIntExtra("id",-1);
тебе надо добавить значение по-умолчанию, например. -1

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 07 ноя 2012, 00:03 

Зарегистрирован: 06 ноя 2012, 21:52
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Olivka писал(а):
int id = intent.getIntExtra("id",-1);
тебе надо добавить значение по-умолчанию, например. -1


Большое спасибо :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 07 ноя 2012, 00:11 

Зарегистрирован: 06 ноя 2012, 21:52
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
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 

Зарегистрирован: 06 ноя 2012, 21:52
Сообщений: 21
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
int id = intent.getIntExtra("id",-1);
tvView.setText("выбран: " + id);

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

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 07 ноя 2012, 00:36 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 12:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
http://www.vr-online.ru/content/znakoms ... rmami-2827
тут сравни что именно ты делаешь..

_________________
R.id.team

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 07 ноя 2012, 10:45 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Olivka писал(а):
Сейчас вас попросят сообщение об ошибке сюда опубликовать.

наверное это фраза въелась от меня :?

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 27 ноя 2012, 02:39 

Зарегистрирован: 19 ноя 2012, 08:20
Сообщений: 28
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Всем салют!!!

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

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

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

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.     // массивы данных
  2.     String[] texts = { "Bla-bla-bla-1", "Bla-bla-bla-2", "Bla-bla-bla-3", "Bla-bla-bla-4", "Bla-bla-bla-5" };
  3.  
  4. ........................................................................................................................
  5.  
  6.     gv.setOnItemClickListener(new OnItemClickListener() {
  7.  
  8.                 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
  9.                         // TODO Auto-generated method stub
  10.                        
  11.                         tv.setText("text = " + texts[position]);
  12.                        
  13.                 }
  14.        
  15.         });
  16.  
  17.  


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

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

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

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

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. ..........................................................
  2. public String GetItem(int position)
  3.           return mContacts[position];
  4. .......................................................
  5.  



Час спустя

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

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.     gv.setOnItemClickListener(new OnItemClickListener() {
  2.  
  3.                 public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
  4.                         // TODO Auto-generated method stub
  5.                         Object obj;
  6.  
  7.                         obj = sAdapter.getItem(position);
  8.                        
  9.                         m = (HashMap)obj;
  10.  
  11.                         tv.setText("Activity name = " + m.get(ATTRIBUTE_NAME_TEXT));
  12.                        
  13.                 }
  14.        
  15.         });
  16.   }
  17.  


Такой вариант норм или это есть ужасно?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 27 ноя 2012, 08:15 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
Блин, наверное 33-й раз уже пишу :)
Для любого адаптера данные всегда первичны. Вы используете списковые View для удобного отображения этих данных, зачем вам их получать у адаптера, если вы итак их имеете и кормите ими адаптер? Что вы скормите адаптеру, то и увидите в списках. Никаких сортировок адаптер не делает, вам нужно будет соотировать массив и давать адаптеру уже отсортированные данные. Так что индексы массивов всегда будут совпадать с элементами списков.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 48. Используем SimpleAdapter.
СообщениеДобавлено: 27 ноя 2012, 12:04 

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


))) Да-да... я и сам уж это понял... блин.. зря 1 час жизни убил


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 86 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB