             return null;
         
         var indexToRecent:int;
+        var temp:int;
         var lastToIndex:int = _tail.rowIndex - index;
         var result:GridRowNode = null;
         
+        if (recentNode)
+        {
+            if (recentNode.rowIndex == index)
+                return recentNode;
+            
+            indexToRecent = recentNode.rowIndex - index;
+            temp = Math.abs(indexToRecent);
+        }
+        
+        if (index < _head.rowIndex)
+        {
+            result = null;
+        }
         // Uses last searched node if its closest to the target.
-        if (lastToIndex < 0)
+        else if (lastToIndex < 0)
         {
             result = _tail;
         }
+        else if (recentNode && temp < lastToIndex && temp < index)
+        {
+            if (indexToRecent > 0)
+                result = findNearestBefore(index, recentNode);
+            else
+                result = findNearestAfter(index, recentNode);
+        }
         else if (lastToIndex < index)
         {
             result = findNearestBefore(index, _tail);

            result = findAfter(index, _head);
        }
        
        recentNode = result;
        
        return result;
    }

        {
            result = findNearestAfter(index, _head);
        }
        
        recentNode = result;
        
        return result;
    }
