Урок 51. SimpleAdapter, добавление и удаление записей

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

Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение damager82 » 26 янв 2012, 07:05

В этом уроке:

- используем SimpleAdapter для построения списка
- добавляем и удаляем записи в списке

[url=http://www.startandroid.ru/ru/uroki/vse ... l:1dqdt8fi]Click here to read this article![/url:1dqdt8fi]
Последний раз редактировалось damager82 08 май 2017, 16:00, всего редактировалось 4 раза.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

caliskan
Сообщения: 3
Зарегистрирован: 27 фев 2012, 11:14

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение caliskan » 27 фев 2012, 11:31

здравствуйте. почему если добавить чекбоксы в пункты списка то контекстное меню не открывается?

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

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение damager82 » 27 фев 2012, 15:35

caliskan писал(а):здравствуйте. почему если добавить чекбоксы в пункты списка то контекстное меню не открывается?
Добавьте атрибут

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

android:descendantFocusability="blocksDescendants"
в корневой layout пункта списка (LinearLayout в item.xml)
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

dlnsk
Сообщения: 9
Зарегистрирован: 13 авг 2012, 14:16

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dlnsk » 17 авг 2012, 10:05

Интересно, есть ли принципиальная разница между вызовом notifyDataSetChanged() и notifyDataSetInvalidated()?
Визуально, вроде, разницы нет.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение neoksi » 17 авг 2012, 10:59

dlnsk писал(а):Интересно, есть ли принципиальная разница между вызовом notifyDataSetChanged() и notifyDataSetInvalidated()?
Визуально, вроде, разницы нет.
Это два противоположных метода:
notifyDataSetChanged() - мы вызываем, когда получили новые данные.
notifyDataSetInvalidated() - мы вызываем, когда произошла ошибка обновления данных.

Вот кусок кода из CursorAdapter'а, в котором это хорошо видно:

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

    public Cursor swapCursor(Cursor newCursor) {
        if (newCursor == mCursor) {
            return null;
        }
        Cursor oldCursor = mCursor;
        if (oldCursor != null) {
            if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver);
            if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver);
        }
        mCursor = newCursor;
        if (newCursor != null) {
            if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver);
            if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver);
            mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
            mDataValid = true;
            // notify the observers about the new cursor
            notifyDataSetChanged();
        } else {
            mRowIDColumn = -1;
            mDataValid = false;
            // notify the observers about the lack of a data set
            notifyDataSetInvalidated();
        }
        return oldCursor;
    }

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dil_android » 08 окт 2012, 10:47

Здравствуйте.

Пытаясь на практике применить знания, полученные по адаптерам, написал простое приложение из двух активити. В первой: дан список продуктов (parent), используется SimpleAdapter; во второй, их расшифровка (child), используется ArrayAdapter. Связь между активити осуществляется посредством Inetent, вот часть кода из parent и child:

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

       lv_simple.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                Intent intent = new Intent(getApplicationContext(), ChildActivity.class);
                intent.putExtra("value", position);
                startActivity(intent);
            }
        });

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

        Intent intent = getIntent();
        value = intent.getIntExtra("value", pos);  // получаем значение position из MainActivity
        onSelectionMade();
    }
    public void onSelectionMade() {
        switch (value) {
            case 0:         // выбран первый элемент родительского списка в MainActivity
                this.adapterDefine(vegetables);
                break;
Включил также, описанную в уроках, возможность удаления и дополнения как родительского, так и child списка через ContextMenu.
С удалением и дополнением child списка все достаточно просто и понятно, а вот с parent у меня возникают вопросы, на которые мне не удается найти ответ. Например, удаляя какую либо позицию в parent, необходимо, чтобы весь ArrayList в child, который относится именно к этой позиции в child, очищался (удалялся?).
Тоже самое в отношении добавления новой позиции в parent. При ее создании автоматически должен создаваться безымянный элемент в child.
Как, все это, лучше сделать? Обращаться ли к адаптеру, проверяя пополнилась (уменьшилась) ли в нем data, или непосредственно к ArrayList? Какие существуют методы, позволяющие реализовать задачу.
Буду признателен за любую подсказку в каком направлении двигаться или действующий пример.

Спасибо.

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

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение rezak90 » 08 окт 2012, 12:03

dil_android
В ChildActivity лучше передавать сами данные, но если используете какие то статические данные то тогда позицию, если же данные динамические то лучше эти данные упаковать в интент и в ChildActivity уже распарсить.
После каких либо манипуляций с данными следует вызывать метод notifyDataSetChanged() адаптера, этот метод обновляет данные.
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dil_android » 08 окт 2012, 16:03

rezak90,

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

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

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение rezak90 » 08 окт 2012, 16:07

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

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dil_android » 08 окт 2012, 16:13

notifyDataSetChanged() вызывается в обоих активити. Если есть простой, но подходящий под ситуацию пример, можно скинуть на dil_android@mail.ru
Это я понял, если есть удалить и добавить, то значит данные уже динамические по определению.
Спасибо

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

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение rezak90 » 08 окт 2012, 16:16

сейчас набросаю простой пример
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dil_android » 08 окт 2012, 18:00

Спасибо большое, получил.

Попытался запустить, выдает
C:\Documents and Settings\Admin\Мои документы\NetBeansProjects\List\build.xml:90: Cannot find C:\Android\android-sdk\tools\ant\build.xml imported from C:\Documents and Settings\Admin\Мои документы\NetBeansProjects\List\build.xml
что это значит?

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

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение rezak90 » 08 окт 2012, 18:48

мои извинения, то я не в Eclipse делал и по этому не запускается, главное посмотри код, там его совсем не много.
З.Ы. может быть если удалить build.xml то Eclipse его заново сгенерит...
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dil_android » 08 окт 2012, 19:59

Понял, спасибо, посмотрю завтра и дам знать через личку.

dcbp
Сообщения: 24
Зарегистрирован: 26 ноя 2012, 10:34

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dcbp » 03 фев 2013, 18:26

А как можно добавить элементы в начало списка, а не в конец?

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

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение damager82 » 05 фев 2013, 13:07

dcbp писал(а):А как можно добавить элементы в начало списка, а не в конец?
Можно: http://docs.oracle.com/javase/6/docs/ap ... (int,%20E)
Метод

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

void add(int index, E element)
Inserts the specified element at the specified position in this list (optional operation). Shifts the element currently at that position (if any) and any subsequent elements to the right (adds one to their indices).
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

dcbp
Сообщения: 24
Зарегистрирован: 26 ноя 2012, 10:34

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение dcbp » 06 фев 2013, 15:12

Спасибо! Весьма полезно!

gad007
Сообщения: 10
Зарегистрирован: 06 фев 2013, 20:47

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение gad007 » 09 фев 2013, 17:41

в примере урока при добавлении нового пункта списка используется текст "sometext", а можно ли сделать чтоб при добавлении нового пункта списка он заполнялся бы переданными данными из другого активити. (к примеру в активити пишем в edittext имя, жмём добавить и в другом активити это имя отображается в пункте списка).
заранее спасибо за ответ.

Озорная Свинья
Сообщения: 59
Зарегистрирован: 02 фев 2013, 00:03

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение Озорная Свинья » 09 фев 2013, 17:58

Я конечно не спец, попробуй объявить:
public ListView lvSimple;
public SimpleAdapter sAdapter;
public ArrayList<Map<String, Object>> data;
public Map<String, Object> m;
и возможно они станут доступными из другого активити)))

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 51. SimpleAdapter, добавление и удаление записей

Сообщение neoksi » 09 фев 2013, 18:37

Озорная Свинья писал(а):Я конечно не спец, попробуй объявить:
public ListView lvSimple;
public SimpleAdapter sAdapter;
public ArrayList<Map<String, Object>> data;
public Map<String, Object> m;
и возможно они станут доступными из другого активити)))
Для передачи данных между активити, есть другие способы, они рассмотрены в других уроках.
А данный способ, не будет работать.

Ответить