Flex中的DataGrid的数据列表并非是根据数据源数据的多少动态生成了N行,如果去看DataGridBase的源码会发现,他里面是有一个makeRow方法和一个clearRow的方法并行实现。这样的话我们可以看出,其实你在进行滚动条拉伸的时候DataGrid进行的就是这两个方法的重复操作,那么这两个方法里又是如何做的,首先看下makeRow方法的实现:
protected function makeRow(contentHolder:ListBaseContentHolder, rowNum:int, left:Number, right:Number, yy:Number, data:Object, uid:String):Number
{
var listItems:Array = contentHolder.listItems;
var columnContent:ListBaseContentHolder;
var item:IListItemRenderer;
var extraItem:IListItemRenderer;
var c:DataGridColumn;
var itemSize:Point;
if (lockedColumnCount > 0)
{
if (contentHolder == lockedRowContent)
columnContent = lockedColumnAndRowContent;
else
columnContent = lockedColumnContent;
}
else
columnContent = null;
var colNum:int = 0;
var xx:Number = left;
var hh:Number = 0;
while (colNum < visibleLockedColumns.length)
{
c = visibleLockedColumns[colNum];
item = setupColumnItemRenderer(c, columnContent, rowNum, colNum, data, uid);
itemSize = layoutColumnItemRenderer(c, item, xx, yy);
xx += itemSize.x;
colNum++;
hh = Math.ceil(Math.max(hh, variableRowHeight ? itemSize.y + cachedPaddingTop + cachedPaddingBottom : rowHeight));
}
if (visibleLockedColumns.length)
{
while (columnContent.listItems[rowNum].length > colNum)
{
// remove extra columns
extraItem = columnContent.listItems[rowNum].pop();
addToFreeItemRenderers(extraItem);
}
}
colNum = 0;
xx = left;
while (xx < right && colNum < visibleColumns.length)
{
c = visibleColumns[colNum];
item = setupColumnItemRenderer(c, contentHolder, rowNum, colNum, data, uid);
itemSize = layoutColumnItemRenderer(c, item, xx, yy);
xx += itemSize.x;
colNum++;
hh = Math.ceil(Math.max(hh, variableRowHeight ? itemSize.y + cachedPaddingTop + cachedPaddingBottom : rowHeight));
}
while (listItems[rowNum].length > colNum)
{
// remove extra columns
extraItem = listItems[rowNum].pop();
addToFreeItemRenderers(extraItem);
}
return hh;
}
稍微看下代码你就会发现他是重复的去设置数据源的item来实现滚动效果。那么这个时候就会经常的出现拉动之后页面的数据总是重复的,或者是原来的数据还在但是新的数据却不显示。简单的方法就是去强制调用DataGrid的InvalidateList和validateNow两个方法来实现动态的刷新视图。如果你使用了数据源绑定操作的话一般来说DataGrid会自动的帮你去更新视图,具体的应该也会去调用这两个方法。所以遇到DataGrid视图方面的问题可以通过这两个方法来试试。invalidateList()这个函数用来刷新 DataGrid 的每一行,validateNow()这个是在 DataGrid 的属性(大小,位置等)改变时,进行手动刷新的。我们要刷新纪录,就要用 invalidateList() 。