2016-08-17 5 views
1

Есть ли разница между:Как правильно обновить данные адаптера?

@Override void onPostExecute(ArrayList<Items> rows) { 
    this.dataset.clear(); 
    this.dataset.addAll(rows); 
    this.dataAdapter.notifyDataSetChanged(); 
} 

и

@Override void onPostExecute(ArrayList<Items> rows) { 
    this.dataset.clear(); 
    this.dataset = rows; 
    this.dataAdapter.notifyDataSetChanged(); 
} 

И, кажется, правильно работать, но большинство примеров, которые я видел об этом использовать первый шаблон.
Вторая ошибка?

+0

На первый взгляд кажется, что первое предположение: вы уже объявили переменную как this.dataset = new ArrayList , чтобы она не бросала нулевой указатель где-то до этого вызова, и это стандартная практика. Второй, я думаю, не требует нового вызова. – sumandas

+0

семантически две операции различны. – Blackbelt

+1

@sumandas, если 'this.dataset' является' null' во втором примере, 'this.dataset.clear()' будет бросать NPE. –

ответ

0

я нашел ответ на Doc Oracle,
+ addAll (Collection с): Добавляет все элементы в указанном наборе до конца этого списка, в том порядке, что они возвращаются на итераторе предписанной коллекции + this.dataset = rows: просто сообщите данные в наборе данных, чтобы удалить и заполнить все данные из «строк» ​​в набор данных.

0

Разница между addAll() и присваивания значения переменной является то, что addAll() согласно docs:

Дописывает все элементы в указанной коллекции в конце этого списка, в том порядке, что они возвращаются на Итератор указанной коллекции.

Это означает, должен ли List быть ненулевым, любые объекты, добавленные с помощью метода addAll() будет добавлен к концу.

Назначение переменных, с другой стороны, будет заменить текущий список, хранящийся в this.dataset, со списком rows. Поэтому это не добавит ничего к предыдущему списку.

Однако, поскольку метод использует this.dataset.clear(), который в соответствии с docs:

Удаляет все элементы из этого списка. После этого вызова список будет пустым.

Функциональность этих двух методов одно и то же, как список пуст прежде, чем быть добавлен к или перезаписаны.


Пожалуйста, обратите внимание, чтобы избежать NullPointerException вероятно, было бы лучше, чтобы добавить какое-то, если-заявление, чтобы проверить, если this.dataset равно нулю перед вызовом this.dataset.clear();

Во втором примере this.dataset.clear() также избыточный , так как переменная сразу же перезаписывается.

+0

Итак, факт, что мы создаем экземпляр адаптера со ссылкой и изменяем ссылку, не влияет на уведомление? – Jim

+0

Можете ли вы перефразировать это @Jim? Не уверен, что я следую за тобой. Если вы говорите, что ваш адаптер не освежает, я думаю, что вам нужно будет изменить набор данных _inner_ dataAdapter, похоже, что вы этого не делаете в настоящее время. –

+0

Я спрашиваю, может ли тот факт, что мы заменяем ссылку вместо добавления/изменения элементов из списка, в котором адаптер имеет ссылку, может иметь какие-то тонкие проблемы – Jim

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