2015-03-29 5 views
2

У меня есть массив: Object[] array и адаптер массива, который расширяет ArrayAdapter<Object>. Когда я пытаюсь удалить из него с помощью adapter.remove(Object obj), я получаю исключение UnsupportedOperationException, так же как this post. В предлагаемых ответах рекомендуется использовать ArrayList. Это не вариант для меня. Мне нужно придерживаться массива. Поэтому я скопировал массив в другой массив, но без элемента, который я хочу удалить. Тогда я только что сделал:Удаление элемента из ArrayAdapter

oldArray = newArray; 

, а затем называется adapter.notifyDataSetChanged();.

Это прекрасно работает, за исключением того, что он не обновляет экран. Мне нужно закрыть, а затем снова открыть экран, чтобы увидеть изменения. Не должно notifyDataSetChanged() сделать освежение?

редактировать:

После @ ответ MD, это то, что я делаю прямо сейчас:

controller.onRemove(id); 

public void onRemove(int id) { 
    int userListLength = usersArray.length; 
    int j = 0; 
    User[] newUserList = new User[userListLength-1]; 
    for(int i=0; i<userListLength; i++) 
    { 
     if(id != usersArray[i].getId()) 
     { 
      newUserList[j] = new User(); 
      newUserList[j] = usersArray[i]; 
      j++; 
     } 
    } 
    usersArray = newUserList; 
    //store in database 
    //... 
    view.getAdapter().refresh(usersArray); 
} 

public void refresh(User[] items) 
{ 
    this.userArray = items; 
    notifyDataSetChanged(); 
} 

адаптер строительства:

adapter = new myUserAdapter(controller.getBaseContext(), R.layout.user_row, userArrayList); 
usersListView.setAdapter(adapter); 

и в myUserAdapter я имеют:

private User[] userArray; 

Решение:

@ ответов работы МД. Но я также должен переопределить getCount() адаптер:

@Override 
public int getCount() { 
    return userArray.length; 
} 

Это объясняется в принятом ответе here.

+0

Может быть, вам нужно показать ваш адаптер здесь – Xcihnegn

+0

пожалуйста также разместить как построить 'ArrayAdapter' – basin

+0

чек снова' адаптер .remove (Object obj) '. На этот раз вы не получите исключения. 'userArrayList' действительно является экземпляром' ArrayList', правильно? – basin

ответ

2

я есть способ

Добавить обновления метод в adapter:

public void refresh(List<String> items) 
{ 
    this.items = items; 
    notifyDataSetChanged(); 
} 

и звонить из Activity как

yourAdapter.refresh(items); // items new arrayList or Array 
+0

Вызов 'notifyDataSetChanged()' этот путь дает исключение: AndroidRuntime (15393): java.lang.RuntimeException: не удается запустить активность –

+0

@AlaaM. Опубликовать некоторый код ... Укроти свою проблему ... –

+0

Я думаю, что хранение дополнительного поля 'items' в классе, которое расширяет ArrayAdapter, не предназначалось авторам – basin

0

ArrayAdapter просто обертывания List<T> вы передаете в конструктор и когда вы вызываете remove(), он вызывает метод remove() этого списка.

Если вы передадите массив вместо списка конструктору, он преобразует его в Arrays.asList().

/** 
* Constructor 
* 
* @param context The current context. 
* @param resource The resource ID for a layout file containing a TextView to use when 
*     instantiating views. 
* @param objects The objects to represent in the ListView. 
*/ 
public ArrayAdapter(Context context, int resource, T[] objects) { 
    init(context, resource, 0, Arrays.asList(objects)); 
} 

В старых версиях Android Arrays.asList возвращает список только для чтения.Вот почему вы получите за исключением

Вы должны явно создать ArrayList из вашего массива:

adapter = new myUserAdapter(controller.getBaseContext(), R.layout.user_row, new ArrayList<User>(Arrays.asList(userArrayList))); 
+0

Как я заявил в вопросе, мне нужно придерживаться 'Array' ... –

+0

@AlaaM. Зачем? Планируете ли вы изменить этот массив? Адаптер не будет отражать изменения в любом случае – basin

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