2012-02-21 5 views
13

У меня есть ArrayAdapter с этой структурой пунктов:андроид пункты 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(); 

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

обн Мой код:

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 

ответ

34

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

public void updatedData(List itemsArrayList) { 

    mAdapter.clear(); 

    if (itemsArrayList != null){ 

     for (Object object : itemsArrayList) { 

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

    mAdapter.notifyDataSetChanged(); 

} 
+4

Вам не нужно добавлять элементы к адаптеру, просто позвоните notifyDataSetChanged, как только вы закончили работу над ArrayList – barry

+1

я называю notifyDataSetChanged, но ничего не происходит – Leo

+0

, что вы делаете в OnClick, или метод, где и что-то изменить в itemsText? – Luciano

4

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

mAdapter.notifyDataSetChanged(); 

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

35

Вашей проблемы типичная ошибка 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();

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

+0

Бис! Очень хорошо и хорошо объяснено. – Tim

+0

Я использую фрагменты. Я сделал все вышеперечисленные шаги. Но я не могу обновить свой массив. Любой совет –

+2

Положите пример, пожалуйста. –

Смежные вопросы