code: def _prefetch_items(self,change):
          
          if self.is_initialized:
              view = self.item_view
              
              upper_limit = view.iterable_index+view.iterable_fetch_size-view.iterable_prefetch
              lower_limit = max(0,view.iterable_index+view.iterable_prefetch)
              offset = int(view.iterable_fetch_size/2.0)
              upper_visible_row = view.visible_rect[2]
              lower_visible_row = view.visible_rect[0]
              print("Visible rect = %s"%view.visible_rect)
              
              if upper_visible_row >= upper_limit:
                  next_index = max(0,upper_visible_row-offset) # Center on current row
                  # Going up works... 
                  if next_index>view.iterable_index:
                      print("Auto prefetch upper limit %s!"%upper_limit)
                      view.iterable_index = next_index
                      #view.model().reset()
                      
              # But doewn doesnt?
              elif view.iterable_index>0 and lower_visible_row < lower_limit:
                  next_index = max(0,lower_visible_row-offset) # Center on current row
                  # Going down works
                  if next_index<view.iterable_index:
                      print("Auto prefetch lower limit=%s, iterable=%s, setting next=%s!"%(lower_limit,view.iterable_index,next_index))
                      view.iterable_index = next_index
docs: When the current_row in the model changes (whether from scrolling) or
          set by the application. Make sure the results are loaded!