We found the problem. It is a bug. Please fix this in next version of touch. This bug also appears in infinite list but it does not crash. But the grid does. The fix:
Code:
Ext.define("App.override.dataview.List", {
override: "Ext.dataview.List",
handleItemHeights: function() {
var me = this,
updatedItems = me.updatedItems,
ln = updatedItems.length,
itemMap = me.getItemMap(),
useSimpleItems = me.getUseSimpleItems(),
minimumHeight = itemMap.getMinimumHeight(),
headerIndices = me.headerIndices,
headerMap = me.headerMap,
variableHeights = me.getVariableHeights(),
itemIndex, i, j, jln, item, height, scrollDockHeight;
for (i = 0; i < ln; i++) {
item = updatedItems[i];
itemIndex = item.$dataIndex;
// itemIndex may not be set yet if the store is still being loaded
if (itemIndex !== null && itemIndex < itemMap.map.length) { //////// <---- do not recalculate not visible items since this adds them to changed indices list
if (variableHeights) {
height = useSimpleItems ? item.element.getHeight() : item.element.getFirstChild().getHeight();
height = Math.max(height, minimumHeight);
} else {
height = minimumHeight;
}
item.$ownItemHeight = height;
jln = me.scrollDockItems.top.length;
if (item.isFirst) {
me.totalScrollDockTopHeight = 0;
for (j = 0; j < jln; j++) {
scrollDockHeight = me.scrollDockItems.top[j].$scrollDockHeight;
height += scrollDockHeight;
me.totalScrollDockTopHeight += scrollDockHeight;
}
}
jln = me.scrollDockItems.bottom.length;
if (item.isLast) {
for (j = 0; j < jln; j++) {
scrollDockHeight = me.scrollDockItems.bottom[j].$scrollDockHeight;
height += scrollDockHeight;
}
}
if (headerIndices && headerIndices[itemIndex]) {
height += me.headerHeight;
}
itemMap.setItemHeight(itemIndex, height);
item.$height = height;
}
}
itemMap.update();
height = itemMap.getTotalHeight();
headerMap.length = 0;
for (i in headerIndices) {
if (headerIndices.hasOwnProperty(i)) {
headerMap.push(itemMap.map[i]);
}
}
me.setScrollerHeight(height);
me.updatedItems.length = 0;
}
});
Ext.define("App.override.util.PositionMap", {
override: "Ext.util.PositionMap",
update: function() {
var adjustments = this.adjustments,
indices = adjustments.indices,
heights = adjustments.heights,
map = this.map,
ln = indices.length,
minimumHeight = this.getMinimumHeight(),
difference = 0,
i, j, height, index, nextIndex, currentHeight;
if (!adjustments.indices.length) {
return false;
}
Ext.Array.sort(indices, function(a, b) {
return a - b;
});
for (i = 0; i < ln; i++) {
index = indices[i];
nextIndex = indices[i + 1] || map.length - 1;
if (index < map.length && nextIndex < map.length) { //////// <---- added if so it stops at map size
currentHeight = (map[index + 1] !== undefined) ? (map[index + 1] - map[index] + difference) : minimumHeight;
height = heights[index];
difference += height - currentHeight;
if (index < map.length-1) //////// <---- added if so it does not grow map, but still adds difference for last item
for (j = index + 1; j <= nextIndex; j++) {
map[j] += difference;
}
}
}
this.offset += difference;
this.adjustments = {
indices: [],
heights: {}
};
return true;
}
});