Moje rozwiązanie: jeśli jest poprawne *, zaktualizuj dane i widoczne elementy bez ponownego rysowania całej listy. Else notifyDataSetChanged.
Prawidłowo - stary rozmiar danych == nowy rozmiar danych oraz stare identyfikatory danych i ich kolejność == nowe identyfikatory i kolejność danych
W jaki sposób:
private static class UniqueValueSparseArray extends SparseArray<View> {
private final HashMap<View,Integer> m_valueToKey = new HashMap<View,Integer>();
@Override
public void put(int key, View value) {
final Integer previousKey = m_valueToKey.put(value,key);
if(null != previousKey) {
remove(previousKey);
}
super.put(key, value);
}
}
@Override
public void setData(final List<? extends DBObject> data) {
if (data == m_data) return;
List<? extends DBObject> oldData = m_data;
m_data = null == data ? Collections.EMPTY_LIST : data;
if (!updateExistingViews(oldData, data)) notifyDataSetChanged();
else if (DEBUG) Log.d(TAG, "Updated without notifyDataSetChanged");
}
private boolean updateExistingViews(List<? extends DBObject> oldData, List<? extends DBObject> newData) {
final int oldDataSize = oldData.size();
if (oldDataSize != newData.size()) return false;
DBObject newObj;
int nVisibleViews = m_visibleViews.size();
if(nVisibleViews == 0) return false;
for (int position = 0; nVisibleViews > 0 && position < oldDataSize; position++) {
newObj = newData.get(position);
if (oldData.get(position).getId() != newObj.getId()) return false;
final View view = m_visibleViews.get(position);
if (null != view) {
bindView(position, view, false);
nVisibleViews--;
}
}
return true;
}
i oczywiście:
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View result = createViewFromResource(position, convertView, parent);
m_visibleViews.put(position, result);
return result;
}
Zignoruj ostatni parametr bindView (używam go do określenia, czy muszę ponownie przetwarzać mapy bitowe dla ImageDrawable).
Jak wspomniano powyżej, całkowita liczba „widocznych” widoków to mniej więcej liczba, która mieści się na ekranie (pomijając zmiany orientacji itp.), Więc nie ma dużej pamięci.