Обновление элементов ArrayAdapter для Android - PullRequest
15 голосов
/ 21 февраля 2012

У меня есть ArrayAdapter с такой структурой элементов:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout ... >

         <TextView
             android:id="@+id/itemTextView"
             ... />
</RelativeLayout>

И добавьте этот адаптер так:

mAdapter = new ArrayAdapter<String>(this, R.layout.item, 
                                            R.id.itemTextView, itemsText);

Все хорошо, но я хочу обновить текст в элементах адаптера. Я нашел решение

mAdapter.notifyDataSetChanged();

но не понимаю, как его использовать. Помогите пожалуйста.

UPD Мой код:

String[] itemsText = {"123", "345", "567"};
ArrayAdapter<String> mAdapter;

OnCreate

mAdapter = new ArrayAdapter<String>(this, R.layout.roomitem, 
                                              R.id.itemTextView, itemsText);
setListAdapter(mAdapter);
itemsText = {"789", "910", "1011"};

OnClick

mAdapter.notifyDataSetChanged();
//it's dont work

Ответы [ 3 ]

39 голосов
/ 19 января 2013

Ваша проблема - типичная ошибка Java с указателями.

На первом этапе вы создаете массив и передаете этот массив адаптеру.

На втором этапе вы создаетеновый массив (поэтому создается новый указатель) с новой информацией, но адаптер по-прежнему указывает на исходный массив.

// init itemsText var and pass to the adapter
String[] itemsText = {"123", "345", "567"};
mAdapter = new ArrayAdapter<String>(..., itemsText);

//ERROR HERE: itemsText variable will point to a new array instance
itemsText = {"789", "910", "1011"};

Итак, вы можете сделать две вещи, одну, обновить содержимое массива вместо созданияновый:

//This will work for your example
items[0]="123";
items[1]="345";
items[2]="567";

... или что бы я делал, используйте Список, что-то вроде:

List<String> items= new ArrayList<String>(3);
boundedDevices.add("123");
boundedDevices.add("456");
boundedDevices.add("789");

И в обновлении:

boundedDevices.set("789");
boundedDevices.set("910");
boundedDevices.set("1011");

Чтобы добавить больше информации, в реальном приложении обычно вы обновляете содержимое адаптера списка информацией от поставщика услуг или контента, поэтому обычно для обновления элементов вы должны сделать что-то вроде:

//clear the actual results
items.clear()

//add the results coming from a service
items.addAll(serviceResults);

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

И, конечно же, после обновления данных вызовите notifyDataSetChanged();

Если у вас есть какие-либо сомнения, не стесняйтесь комментировать.

37 голосов
/ 21 февраля 2012

Я думаю, что-то вроде этого

public void updatedData(List itemsArrayList) {

    mAdapter.clear(); 

    if (itemsArrayList != null){

        for (Object object : itemsArrayList) {

            mAdapter.insert(object, mAdapter.getCount());
        }
    }

    mAdapter.notifyDataSetChanged();

}
4 голосов
/ 21 февраля 2012

Предполагая, что itemTexts представляет собой массив String или String ArrayList, в который вы добавляете новые элементы в itemsTextat, и через это время вы можете вызвать

mAdapter.notifyDataSetChanged();

Если вы не получили ответа, введите код.

...