code: public List<Item> deleteAllSelectedItems() {
          List<Item> deletedItems = new ArrayList<>();
  
          final List<Integer> positions = new ArrayList<>();
          mFastAdapter.recursive(new AdapterPredicate<Item>() {
              @Override
              public boolean apply(@NonNull IAdapter<Item> lastParentAdapter, int lastParentPosition, Item item, int position) {
                  if (item.isSelected()) {
                      //if it's a subitem remove it from the parent
                      if (item instanceof ISubItem) {
                          //a sub item which is not in the list can be instantly deleted
                          IExpandable parent = (IExpandable) ((ISubItem) item).getParent();
                          //parent should not be null, but check in any case..
                          if (parent != null) {
                              parent.getSubItems().remove(item);
                          }
                      }
                      if (position != -1) {
                          //a normal displayed item can only be deleted afterwards
                          positions.add(position);
                      }
                  }
                  return false;
              }
          }, false);
  
          //we have to re-fetch the selections array again and again as the position will change after one item is deleted
          for (int i = positions.size() - 1; i >= 0; i--) {
              FastAdapter.RelativeInfo<Item> ri = mFastAdapter.getRelativeInfo(positions.get(i));
              if (ri.item != null && ri.item.isSelected()) { //double verify
                  if (ri.adapter != null && ri.adapter instanceof IItemAdapter) {
                      ((IItemAdapter) ri.adapter).remove(positions.get(i));
                  }
              }
          }
          return deletedItems;
      }
docs: deletes all current selected items
  
  @return a list of the IItem elements which were deleted