docs: protected int fill(RecyclerView.Recycler recycler, LayoutState layoutState,
                         RecyclerView.State state, boolean stopOnFocusable) {
          // max offset we should set is mFastScroll + available
          final int start = layoutState.mAvailable;
          if (layoutState.mScrollingOffset != LayoutState.SCOLLING_OFFSET_NaN) {
              // TODO ugly bug fix. should not happen
              if (layoutState.mAvailable < 0) {
                  layoutState.mScrollingOffset += layoutState.mAvailable;
              }
              recycleByLayoutStateExpose(recycler, layoutState);
          }
          int remainingSpace = layoutState.mAvailable + layoutState.mExtra + recycleOffset;
          while (remainingSpace > 0 && layoutState.hasMore(state)) {
              layoutChunkResultCache.resetInternal();
              layoutChunk(recycler, state, layoutState, layoutChunkResultCache);
              if (layoutChunkResultCache.mFinished) {
                  break;
              }
              layoutState.mOffset += layoutChunkResultCache.mConsumed * layoutState.mLayoutDirection;
              /**
               * Consume the available space if:
               * * layoutChunk did not request to be ignored
               * * OR we are laying out scrap children
               * * OR we are not doing pre-layout
               */
              if (!layoutChunkResultCache.mIgnoreConsumed || mLayoutState.mScrapList != null
                      || !state.isPreLayout()) {
                  layoutState.mAvailable -= layoutChunkResultCache.mConsumed;
                  // we keep a separate remaining space because mAvailable is important for recycling
                  remainingSpace -= layoutChunkResultCache.mConsumed;
              }
  
              if (layoutState.mScrollingOffset != LayoutState.SCOLLING_OFFSET_NaN) {
                  layoutState.mScrollingOffset += layoutChunkResultCache.mConsumed;
                  if (layoutState.mAvailable < 0) {
                      layoutState.mScrollingOffset += layoutState.mAvailable;
                  }
                  recycleByLayoutStateExpose(recycler, layoutState);
              }
              if (stopOnFocusable && layoutChunkResultCache.mFocusable) {
                  break;
              }
          }
          if (DEBUG) {
              validateChildOrderExpose();
          }
          return start - layoutState.mAvailable;
      }