code: @SuppressWarnings("unchecked")
      public static <Item extends IItem> Triple<Boolean, Item, Integer> recursiveSub(IAdapter<Item> lastParentAdapter, int lastParentPosition, IExpandable parent, AdapterPredicate<Item> predicate, boolean stopOnMatch) {
          //in case it's expanded it can be selected via the normal way
          if (!parent.isExpanded() && parent.getSubItems() != null) {
              for (int ii = 0; ii < parent.getSubItems().size(); ii++) {
                  Item sub = (Item) parent.getSubItems().get(ii);
  
                  if (predicate.apply(lastParentAdapter, lastParentPosition, sub, -1) && stopOnMatch) {
                      return new Triple<>(true, sub, null);
                  }
  
                  if (sub instanceof IExpandable) {
                      Triple<Boolean, Item, Integer> res = FastAdapter.recursiveSub(lastParentAdapter, lastParentPosition, (IExpandable) sub, predicate, stopOnMatch);
                      if (res.first) {
                          return res;
                      }
                  }
              }
          }
          return new Triple<>(false, null, null);
      }
docs: Util function which recursively iterates over all items of a `IExpandable` parent if and only if it is `expanded` and has `subItems`
  This is usually only used in
  
  @param lastParentAdapter  the last `IAdapter` managing the last (visible) parent item (that might also be a parent of a parent, ..)
  @param lastParentPosition the global position of the last (visible) parent item, holding this sub item (that might also be a parent of a parent, ..)
  @param parent             the `IExpandableParent` to start from
  @param predicate          the predicate to run on every item, to check for a match or do some changes (e.g. select)
  @param stopOnMatch        defines if we should stop iterating after the first match
  @param <Item>             the type of the `Item`
  @return Triple&lt;Boolean, IItem, Integer&gt; The first value is true (it is always not null), the second contains the item and the third the position (if the item is visible) if we had a match, (always false and null and null in case of stopOnMatch == false)