Для чего используется и как работает метод 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 шт):

Автор решения: pavlofff

Метод notifyDataSetChanged() указывает адаптеру, что полученные ранее данные изменились и следует перерисовать список на экране.

Из за изменений кода ничего не поменялось только визуально, программно же все стало намного печальнее.

В коде из книги проверяется, создан ли адаптер для списка и если не создан, то создается новый, а если создан, то обновляются данные уже имеющегося адаптера. Таким образом мы имеем только один объект, который работает все время отображения списка.

В вашем случае каждый раз создаётся новый адаптер, независимо от того, есть уже точно такой же или нет. Это крайне не оптимальное решение, так как объекты адаптера и содержимого списка будут плодиться с частотой обновления этого списка, заполнять собой память и нагружать сборщик мусора. После каждого такого обновления созданный до этого адаптер будет просто выкинут и останется бесполезным грузом занимать память, взамен его создаётся новый и так каждый раз при очередном обновлении списка.

p.s: во многом благодаря таким решениям и вот этим вот "ничего же не изменилось" андроид и имеет репутацию тормозной и глючной системы

→ Ссылка