private void redraw(final Range range) {
        if (list != null) {
            final List<R> subList;
            if (isFullList) {
                // list is ALL the data so make a sub list from the range
                subList = new ArrayList<>();
                for (int i = range.getStart(); i < (range.getStart() + range.getLength()) && i < list.size(); i++) {
                    subList.add(list.get(i));
                }
            } else {
                // list is not all the data so already represents a range, so use it as is
                subList = list;
            }
            if (treeRowHandler != null) {
                treeRowHandler.handle(list);
            }

            updateRowData(range.getStart(), subList);
            updateRowCount(totalSize, true);
        }
    }
@param listUpdater This consumer is expected to get new data and
                   call setCompleteList or setPartialList with the new data
stroom-core-client/src/main/java/stroom/config/global/client/presenter/ListDataProvider.java