Для чего используется и как работает метод notifyDataSetChanged()?
Писал программу по книге "Android программирование для профессионалов". Там, для того, чтобы обновить данные в списке, использовался метод notifyDataSetChanged():
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
}
@Override public void onResume() {
super.onResume();
updateUI();
}
private void updateUI() {
CrimeLab crimeLab = CrimeLab.get(getActivity());
List<Crime> crimes = crimeLab.getCrimes();
if (mAdapter == null) {
mAdapter = new CrimeAdapter(crimes);
mCrimeRecyclerView.setAdapter(mAdapter);
} else {
mAdapter.notifyDataSetChanged();
}
Но когда я убирал метод notifyDataSetChanged() и приводил код updateUI() к виду:
private void updateUI() {
CrimeLab crimeLab = CrimeLab.get(getActivity());
List<Crime> crimes = crimeLab.getCrimes();
mAdapter = new CrimeAdapter(crimes);
mCrimeRecyclerView.setAdapter(mAdapter);
}
Всё работало точно также. Всё, что я добавлял в другую активность, добавлялось в список, также, как и с использованием notifyDataSetChanged().
Ответы (1 шт):
Метод notifyDataSetChanged() указывает адаптеру, что полученные ранее данные изменились и следует перерисовать список на экране.
Из за изменений кода ничего не поменялось только визуально, программно же все стало намного печальнее.
В коде из книги проверяется, создан ли адаптер для списка и если не создан, то создается новый, а если создан, то обновляются данные уже имеющегося адаптера. Таким образом мы имеем только один объект, который работает все время отображения списка.
В вашем случае каждый раз создаётся новый адаптер, независимо от того, есть уже точно такой же или нет. Это крайне не оптимальное решение, так как объекты адаптера и содержимого списка будут плодиться с частотой обновления этого списка, заполнять собой память и нагружать сборщик мусора. После каждого такого обновления созданный до этого адаптер будет просто выкинут и останется бесполезным грузом занимать память, взамен его создаётся новый и так каждый раз при очередном обновлении списка.
p.s: во многом благодаря таким решениям и вот этим вот "ничего же не изменилось" андроид и имеет репутацию тормозной и глючной системы