मेरा समाधान: यदि यह सही है *, पूरी सूची को पुन: आरेखित किए बिना डेटा और देखने योग्य वस्तुओं को अपडेट करें। अन्य सूचना
सही - पुराना डेटा आकार == नया डेटा आकार, और पुराना डेटा आईडी और उनका क्रम == नया डेटा आईडी और ऑर्डर
किस तरह:
/**
* A View can only be used (visible) once. This class creates a map from int (position) to view, where the mapping
* is one-to-one and on.
*
*/
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);//re-mapping
}
super.put(key, value);
}
}
@Override
public void setData(final List<? extends DBObject> data) {
// TODO Implement 'smarter' logic, for replacing just part of the 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");
}
/**
* See if we can update the data within existing layout, without re-drawing the list.
* @param oldData
* @param newData
* @return
*/
private boolean updateExistingViews(List<? extends DBObject> oldData, List<? extends DBObject> newData) {
/**
* Iterate over new data, compare to old. If IDs out of sync, stop and return false. Else - update visible
* items.
*/
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;
// iterate over visible objects and see if this ID is there.
final View view = m_visibleViews.get(position);
if (null != view) {
// this position has a visible view, let's update it!
bindView(position, view, false);
nVisibleViews--;
}
}
return true;
}
और निश्चित रूप से:
@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;
}
BindView के लिए अंतिम पैराम को अनदेखा करें (मैं इसका उपयोग यह निर्धारित करने के लिए करता हूं कि मुझे इमेजडबल के लिए बिटमैप रीसायकल करने की आवश्यकता है या नहीं)।
जैसा कि ऊपर उल्लेख किया गया है, 'दृश्यमान' विचारों की कुल संख्या लगभग वह राशि है जो स्क्रीन पर फिट होती है (अभिविन्यास परिवर्तनों को अनदेखा करते हुए), इसलिए कोई बिग्गी मेमोरी-वार नहीं।