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

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

Добавлено: 26 янв 2012, 07:05
damager82
В этом уроке:

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

[url=http://www.startandroid.ru/ru/uroki/vse ... l:1dqdt8fi]Click here to read this article![/url:1dqdt8fi]

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

Добавлено: 27 фев 2012, 11:31
caliskan
здравствуйте. почему если добавить чекбоксы в пункты списка то контекстное меню не открывается?

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

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

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

android:descendantFocusability="blocksDescendants"
в корневой layout пункта списка (LinearLayout в item.xml)

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

Добавлено: 17 авг 2012, 10:05
dlnsk
Интересно, есть ли принципиальная разница между вызовом notifyDataSetChanged() и notifyDataSetInvalidated()?
Визуально, вроде, разницы нет.

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

Добавлено: 17 авг 2012, 10:59
neoksi
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;
    }

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

Добавлено: 08 окт 2012, 10:47
dil_android
Здравствуйте.

Пытаясь на практике применить знания, полученные по адаптерам, написал простое приложение из двух активити. В первой: дан список продуктов (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? Какие существуют методы, позволяющие реализовать задачу.
Буду признателен за любую подсказку в каком направлении двигаться или действующий пример.

Спасибо.

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

Добавлено: 08 окт 2012, 12:03
rezak90
dil_android
В ChildActivity лучше передавать сами данные, но если используете какие то статические данные то тогда позицию, если же данные динамические то лучше эти данные упаковать в интент и в ChildActivity уже распарсить.
После каких либо манипуляций с данными следует вызывать метод notifyDataSetChanged() адаптера, этот метод обновляет данные.

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

Добавлено: 08 окт 2012, 16:03
dil_android
rezak90,

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

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

Добавлено: 08 окт 2012, 16:07
rezak90
динамически имеется в виду данные добавляются в программе, а статические это неизменяемые данные, то есть достаточно передать позицию на статические данные что бы отобразить их во второй активити. А если же данные добавляются в процессе то передав позицию на данных и в процессе передачи данные могут изменится и позиция уже будет указывать не на то что нужно.

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

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

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

Добавлено: 08 окт 2012, 16:16
rezak90
сейчас набросаю простой пример

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

Добавлено: 08 окт 2012, 18:00
dil_android
Спасибо большое, получил.

Попытался запустить, выдает
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
что это значит?

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

Добавлено: 08 окт 2012, 18:48
rezak90
мои извинения, то я не в Eclipse делал и по этому не запускается, главное посмотри код, там его совсем не много.
З.Ы. может быть если удалить build.xml то Eclipse его заново сгенерит...

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

Добавлено: 08 окт 2012, 19:59
dil_android
Понял, спасибо, посмотрю завтра и дам знать через личку.

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

Добавлено: 03 фев 2013, 18:26
dcbp
А как можно добавить элементы в начало списка, а не в конец?

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

Добавлено: 05 фев 2013, 13:07
damager82
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).

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

Добавлено: 06 фев 2013, 15:12
dcbp
Спасибо! Весьма полезно!

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

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

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

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

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

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