Урок 47. Обзор адаптеров

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

Урок 47. Обзор адаптеров

Сообщение damager82 » 11 янв 2012, 08:55

В этом уроке:

- разбираемся в адаптерах

Click here to read this article!
Последний раз редактировалось damager82 11 янв 2012, 12:55, всего редактировалось 11 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
RagnarR
Сообщения: 29
Зарегистрирован: 11 янв 2012, 11:02
Откуда: Belarus

Re: Урок 47. Обзор адаптеров

Сообщение RagnarR » 12 янв 2012, 09:37

В общем-то интересны все варианты. Опыт лишним не бывает. В первую очередь хотелось бы посмотреть на работу с SimpleAdapter, и SimpleCursorAdapter. Интересует еще работа с методом setViewBinder.

Урок в целом хорош, но требует продолжения ;)
--[+++++++<---->>-->+>+>+<<<<]
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.

Gorets
Сообщения: 8
Зарегистрирован: 12 янв 2012, 12:38

Re: Урок 47. Обзор адаптеров

Сообщение Gorets » 12 янв 2012, 12:40

Приятно видеть развитие проекта =)

_saper_
Сообщения: 8
Зарегистрирован: 11 янв 2012, 17:18

Re: Урок 47. Обзор адаптеров

Сообщение _saper_ » 12 янв 2012, 14:03

огромное спасибо, хоть немного начинает складываться в голове картина о этих адаптерах, а то их блин целая куча.
я пока использую BaseAdapter из примера про GridView http://developer.android.com/resources/ ... dview.html
он хорош тем, что умеет выводить всё что угодно, тем более заработало сразу

shten
Сообщения: 1
Зарегистрирован: 13 янв 2012, 16:08

Re: Урок 47. Обзор адаптеров

Сообщение shten » 13 янв 2012, 16:10

Здравствуйте! Спасибо большое за уроки - все очень доступно рассказано.
Хотелось бы увидеть пример работы с SimpleCursorTreeAdapter.

lics
Сообщения: 10
Зарегистрирован: 03 фев 2012, 19:11

Re: Урок 47. Обзор адаптеров

Сообщение lics » 05 фев 2012, 01:18

Здравствуйте!
Хотелось бы увидеть пример работы с HeaderViewListAdapter.

Спасибо

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

Re: Урок 47. Обзор адаптеров

Сообщение damager82 » 07 фев 2012, 13:16

lics писал(а): Хотелось бы увидеть пример работы с HeaderViewListAdapter.
Как раз в ближайший четверг (09.02) выйдет урок по Header и Footer )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
A.N.R.I
Сообщения: 2
Зарегистрирован: 21 июн 2012, 16:51

Re: Урок 47. Обзор адаптеров

Сообщение A.N.R.I » 24 июн 2012, 17:11

Не подскажете, какой адаптер следует выбрать, чтобы можно было сразу создать одинаковый список элементов, но и можно было изменить внешний вид какого-то одного элемента списка динамически?

я начал с BaseAdapter. Каждый элемент имеет CheckBox и ProgressBar (visibility = View.GONE). При клике на кнопку у всех элементах, в которых выделенный чекбокс, должен появляется ProgressBar (visibility = View.VISIBLE), но я не знаю, как достать нужный item и изменить его вид

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

Re: Урок 47. Обзор адаптеров

Сообщение AndreyI » 24 июн 2012, 19:59

A.N.R.I писал(а):Не подскажете, какой адаптер следует выбрать, чтобы можно было сразу создать одинаковый список элементов, но и можно было изменить внешний вид какого-то одного элемента списка динамически?

я начал с BaseAdapter. Каждый элемент имеет CheckBox и ProgressBar (visibility = View.GONE). При клике на кнопку у всех элементах, в которых выделенный чекбокс, должен появляется ProgressBar (visibility = View.VISIBLE), но я не знаю, как достать нужный item и изменить его вид
Адаптер работает во время создания элементов списка, поэтому без разницы какой вы будете использовать.
Для доступа к элементам списка всегда можно воспользоваться методами унаследованными от ViewGroup для поиска дочерних элементов по индексу.
Но т.к. вы используете чек-боксы, значит у вас должна быть функция обратного вызова для контроля изменения их состояния. Эта функция передаст вам ссылку на соответствующий чек-бокс. Вызовом getParent () вы получите родительский элемент вашего чек-бокса, т.е Layout элемента списка. Далее можете использовать, к примеру, findViewById.

Eva
Сообщения: 4
Зарегистрирован: 11 окт 2013, 20:22

Re: Урок 47. Обзор адаптеров

Сообщение Eva » 16 ноя 2014, 12:36

Добрый день! Парни, подскажите. Есть ArrayAdapter и ArrayList. На экране ListView, который наполняется динамически. Проблема с элементами ListView, которые не видны на экране. Когда я прокручиваю ЛистВью и эти элементы становятся видны, то значения там не те, что должны быть, а те, что были в начале списка. А если много раз его прокручивать вверх/вниз, то записи начинают дублироваться и смешиваться. Может ли кто предположить, с чем это может быть связано?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 47. Обзор адаптеров

Сообщение doter.ua » 16 ноя 2014, 14:15

Eva писал(а):Добрый день! Парни, подскажите. Есть ArrayAdapter и ArrayList. На экране ListView, который наполняется динамически. Проблема с элементами ListView, которые не видны на экране. Когда я прокручиваю ЛистВью и эти элементы становятся видны, то значения там не те, что должны быть, а те, что были в начале списка. А если много раз его прокручивать вверх/вниз, то записи начинают дублироваться и смешиваться. Может ли кто предположить, с чем это может быть связано?
Код в студию.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

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

Re: Урок 47. Обзор адаптеров

Сообщение Foenix » 16 ноя 2014, 21:46

неверно реализован адаптер
R.id.team

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

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

Re: Урок 47. Обзор адаптеров

Сообщение evgen_dndz » 26 ноя 2014, 00:13

Всем привет!
Может кто подскажет? есть возможность вставить в адаптер элемент WebView?
Нужен для отображения в списке картинок маленького формата из интернет без необходимости сохранения. Рысачу интернет уже 2 дня в поисках решения. В том числе форум. Результата нет.
Как я понимаю из уроков WebView не является элементом для построения списка.
Пробовал уже в setViewBinder при настройке View через AsyncTask использовать метод loadUrl().
Уточню - я понимаю, что через ж... :)
Но адаптер(SimpleAdapter) Все равно отказывается работать(что как я понял не удивительно).
Получилось через "Урок 41. Используем LayoutInflater для создания списка" но не подходит. Нужно кликабельный полноценный список. Да и метод WebView.getSettings() ругается "cannot be referenced from a static context".
Может кто знает другой способ создания списка с подгрузкой элементов из интернет?

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

Re: Урок 47. Обзор адаптеров

Сообщение evgen_dndz » 28 ноя 2014, 02:47

Если кому то интересно и тоже пригодится - то мой вопрос решается так:

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

imgView.setImageDrawable(grabImageFromUrl(url));

private Drawable grabImageFromUrl(String url) throws Exception {
		return Drawable.createFromStream(
				(InputStream) new URL(url).getContent(), "src");
	}
Используем AsyncTask и получаем:

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

class PicLoader extends AsyncTask<String, Void, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            try {
                TimeUnit.SECONDS.sleep(0);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String p = params[0];
            return p;
        }

        @Override
        protected void onPostExecute(String p) {
            super.onPostExecute(p);
            try {
                imgView.setImageDrawable(grabImageFromUrl(url));
            } catch (Exception e) {
                Log.d(LOG_TAG, "Exception в onPostExecute class CatTask extends AsyncTask");
            }
        }
        private Drawable grabImageFromUrl(String url) throws Exception {
            return Drawable.createFromStream(
                    (InputStream) new URL(url).getContent(), "src");
        }
    }

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

Re: Урок 47. Обзор адаптеров

Сообщение finberg » 28 ноя 2014, 08:46

А почему загрузка картинок происходит в onPostExecute? Правильно наверно делать doInBackground.

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

Re: Урок 47. Обзор адаптеров

Сообщение evgen_dndz » 28 ноя 2014, 19:32

Ну на сколько я понимаю из :
"В методе doInBackground() идёт имитация тяжёлой работы. Здесь нельзя писать код, связанный с пользовательским интерфейсом." - то нет.

И еще назрел вопрос. Может кто подскажет? Создаю класс:

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

class MyViewBinder implements SimpleAdapter.ViewBinder {


        @Override
        public boolean setViewValue(View view, Object data,
                                    String textRepresentation) {
            String url = (String)data;

            switch (view.getId()) {
                // LinearLayout
                case R.id.ivImg:
                       new PicLoader(MainActivity.this).execute(url);
                    return true;
            }
            return false;
        }
    }

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

class PicLoader extends AsyncTask<String, Void, String[]> {

        Context context;

        ImageView ivImg = (ImageView)findViewById(R.id.ivImg);

        final String LOG_TAG = "myLogs";
        
        public PicLoader(Context context) {
            super();
            this.context = context;
        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.d(LOG_TAG, "Start PicLoader extends AsyncTask");
        }

        @Override
        protected String[] doInBackground(String... params) {
              String[] urls = params;
                return urls;
        }

        @Override
        protected void onPostExecute(String[] urls) {
            super.onPostExecute(urls);
            for(String url:urls) {
                try {
                    ivImg.setImageDrawable(grabImageFromUrl(url));
                } catch (Exception e) {
                    Log.d(LOG_TAG, "Exception в onPostExecute class PicLoader extends AsyncTask");
                }
            }
        }
        private Drawable grabImageFromUrl(String url) throws Exception {
            return Drawable.createFromStream(
                    (InputStream) new URL(url).getContent(), "src");
        }
    }
Создаю адаптер и скармливаю ему биндер:

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

ArrayList<Map<String, Object>> data_menu = new ArrayList<Map<String, Object>>();
String[] from = {NAME, ADDRESS, PHONE, IMAGE};
int[] to = { R.id.tvName, R.id.tvAddress, R.id.tvPhone,R.id.ivImg};

        // адаптер
        sAdapter = new SimpleAdapter(this, data_menu, R.layout.item_rest,
                from, to);

        // биндер
        sAdapter.setViewBinder(new MyViewBinder());
data_menu - ArrayList<Map<String, Object>>

Имеется 3 TextView и 1 ImageView который и подвергается надругательству :)
В результате картинка грузится только в первом пункте меню. Остальные остаются пустыми.
Похоже одно View получает и отображает поочередно все картинки.

Кроме того получаю вот такой лог:

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

11-28 18:27:54.786      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:54.806      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:54.816      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:54.826      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:54.846      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:54.866      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:55.496      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception e - java.lang.NullPointerException
11-28 18:27:55.496      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception в onPostExecute class PicLoader extends AsyncTask
11-28 18:27:55.756      564-564/com.example.fikus.post241114 D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed 281K, 51% free 2913K/5831K, external 2097K/2137K, paused 86ms
11-28 18:27:55.816      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception e - java.lang.NullPointerException
11-28 18:27:55.816      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception в onPostExecute class PicLoader extends AsyncTask
11-28 18:27:55.986      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception e - java.lang.NullPointerException
11-28 18:27:55.986      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception в onPostExecute class PicLoader extends AsyncTask
11-28 18:27:56.227      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception e - java.lang.NullPointerException
11-28 18:27:56.227      564-564/com.example.fikus.post241114 D/myLogs﹕ Exception в onPostExecute class PicLoader extends AsyncTask
11-28 18:27:56.616      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:56.616      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:56.626      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:57.157      564-564/com.example.fikus.post241114 D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed 300K, 52% free 2907K/5959K, external 2569K/2747K, paused 74ms
11-28 18:27:57.396      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:57.406      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:57.406      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:58.016      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:58.026      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:58.057      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:58.636      312-312/? D/dalvikvm﹕ GC_EXPLICIT freed 1K, 54% free 2538K/5511K, external 1625K/2137K, paused 66ms
11-28 18:27:58.756      564-564/com.example.fikus.post241114 D/dalvikvm﹕ GC_EXTERNAL_ALLOC freed 334K, 52% free 2907K/6023K, external 2822K/2840K, paused 72ms
11-28 18:27:58.777      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:58.788      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:58.796      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:59.486      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:59.496      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:27:59.507      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:28:00.427      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:28:00.437      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
11-28 18:28:00.446      564-564/com.example.fikus.post241114 D/myLogs﹕ Start PicLoader extends AsyncTask
И так пока не закроешь приложение в эмуляторе.
Подскажите пожалуйста, в чем моя ошибка?

evgen_dndz
Сообщения: 11
Зарегистрирован: 28 окт 2014, 14:43

Re: Урок 47. Обзор адаптеров

Сообщение evgen_dndz » 29 ноя 2014, 00:31

вопрос решен.

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

Re: Урок 47. Обзор адаптеров

Сообщение finberg » 30 ноя 2014, 13:39

У вас grabImageFromUrl() - это долгий процесс, который должен быть отработан в doInBackground.

а в onPostExecute вам надо сделать только ivImg.setImageDrawable.

Ну и AsyncTask <String, Void, Drawable> должен быть.

Ответить