The following builds upon https://tex.stackexchange.com/a/417571/117050 but extends it a lot. It defines the macros:
\InsertListR[<correction>]{<skip>}{<contents>} with the arguments <correction> being a correction factor as used by insbox (use it to extend the amount of lines affected), <skip> being a number of lines to skip before the insertion and <contents> being a box which is to be inserted.
\wrapitem used to start the first item after which you use \InsertListR
\contitem another item after you used \InsertListR which should also be affected. It takes an optional argument specifying the number of affected lines (defaulting to a whooping 100)
\EndInsert to manually stop the effects of an \InsertListR or any of the other insbox macros. It also starts a new paragraph. If the indentation should be suppressed you can use the starred version.
MWE:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{duckuments}% funnier than lipsum
\usepackage[margin=2cm]{geometry}
\usepackage{capt-of}
\usepackage{enumitem}
\input{insbox.tex}
\usepackage{etoolbox}
\newcommand*\wrapitem
{%
\apptocmd\labelitemi{\hskip\leftmargin}{}{}% add a correction
\item
\patchcmd\labelitemi{\hskip\leftmargin}{}{}{}% remove the added hskip
}
\newsavebox\InsertListRbox
\newlength\InsertListPrevWidth
\makeatletter
\newcommand{\InsertListR}[3][]
{%
\mbox{}%
\vspace*{-\baselineskip}%
\setlength{\leftskip}{\leftmargin}%
\setbox\InsertListRbox\hbox{#3}%
\global\InsertListPrevWidth
\dimexpr
\wd\InsertListRbox+\@InsertBoxMargin
\relax
\InsertBoxR{#2}{\hskip-\leftmargin\box\InsertListRbox\hskip\leftmargin}[#1]%
}%
\newcommand*\contitem[1][100]
{%
\item
\ParShape=3
{0} 0cm 0cm
{#1} 0cm {\the\InsertListPrevWidth}
1 0cm 0cm
}
\newcommand*\EndInsert
{
\@restore@
\@ifstar{\@afterindentfalse\@afterheading}{}%
}
\makeatother
\begin{document}
\blindduck[1]
\begin{multicols}{0}
\section{Introduction}
\blindduck[-5]
\begin{itemize}
\wrapitem
\InsertListR{0}
{%
\parbox{.48\columnwidth}
{%
\includegraphics[width=.48\columnwidth]{example-image-duck}%
\captionof{figure}{foo}%
}%
}%
one very very very very very long text
\contitem two very very very very very long text
\contitem three very very very very very long text
\end{itemize}
\EndInsert*
\blindduck[1-5]
\end{multicols}
\end{document}
Results:

EDIT: More reasonable default for \contitem. By default this version does the same calculation insbox is doing to calculate the number of the affected lines. You can give the number explicitly if you're not satisfied with the results. It also changes the default value of \InsertListR to be a reasonable 0 (an empty default argument would be the same as 1, which won't be the expected behaviour from insbox).
Also for reasons I don't yet understand, the effect of \InsertListR is ended by the next new paragraph after the itemize environment. I therefore added a macro \MoreInsert which takes as its argument the number of lines which should be affected in the current paragraph (only in the current, another new paragraph ends its effect).
New code (in a complete MWE):
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{duckuments}% funnier than lipsum
\usepackage[margin=2cm]{geometry}
\usepackage{capt-of}
\usepackage{enumitem}
\input{insbox.tex}
\usepackage{etoolbox}
\newcommand*\wrapitem
{%
\apptocmd\labelitemi{\hskip\leftmargin}{}{}% add a correction
\item
\patchcmd\labelitemi{\hskip\leftmargin}{}{}{}% remove the added hskip
}
\newlength\InsertListPrevWidth
\makeatletter
\newcommand{\InsertListR}[3][0]
{%
\mbox{}%
\vspace*{-\baselineskip}%
\setlength{\leftskip}{\leftmargin}%
\InsertBoxR{#2}{\hskip-\leftmargin#3\hskip\leftmargin}[#1]%
\global\InsertListPrevWidth\@framewidth
}%
\newcommand*\contitem[1][\the\count1]
{%
\item
\bgroup % to keep some changes local
% let's calculate parameters for \ParShape
\def\reserved@a{#1}%
\def\reserved@b{\the\count1}%
\ifx\reserved@a\reserved@b
% Below calculation is copied from \@@InsertBox of insbox
\dimen0 = \@wherebottom
\advance \dimen0 by -\pagetotal
\divide \dimen0 by \baselineskip
\count1 = \dimen0
\advance \count1 by 1
\advance \count1 by -\@numnormal
\fi
\MoreInsert{#1}%
\egroup
}
\newcommand*\EndInsert
{%
\@restore@
\@ifstar{\@afterindentfalse\@afterheading}{}%
}
\newcommand*\MoreInsert[1]
{%
\ParShape = 2
{#1} 0cm {\the\InsertListPrevWidth}
1 0cm 0cm
}
\makeatother
\begin{document}
\blindduck[1]
\begin{multicols}{0}
\section{Introduction}
\blindduck[-5]
\begin{itemize}
\wrapitem
\InsertListR{0}
{%
\parbox{.48\columnwidth}
{%
\includegraphics[width=.48\columnwidth]{example-image-duck}%
\captionof{figure}{foo}%
}%
}%
one very very very very very long text
\contitem two very very very very very long text
\contitem three very very very very very long text
\end{itemize}
\MoreInsert{1}
\blindduck[1-5]
\blindduck[1-5]
\end{multicols}
\end{document}
\makeatletter\@InsertBoxMargin=<length>\makeatotherin your preamble after\input{insbox.tex}. Obviously<length>should be the width you want to use. Default ofinsboxis2mmif I remember correctly. – Skillmon Oct 03 '18 at 15:37\usepackage{caption}breaks this solution (especially the\MoreInsertcommand. I changed to\usepackage{capt-of}like @Skillmon has on their example and it works flawlessly. – Rui Apóstolo Oct 04 '18 at 15:41caption, generating identical output as withcapt-ofin my test cases. – Skillmon Oct 05 '18 at 07:28xcolorandcontouron my figure captions. But as I said, withcapt-ofall works. – Rui Apóstolo Oct 05 '18 at 12:39\MoreInsertisn't working in your code is because you start a new paragraph after using it (the empty line). As mentioned in my edit, it has to be used inside of the paragraph (put the empty line from below\MoreInsertabove it). Also in this case you'd have to use the optional argument of\contitembecause the default calculation fails (this is due to the additional spacing around the items in anitemizeenvironment). – Skillmon Oct 07 '18 at 07:22\MoreInsertcommand.I went back to my previous version of the poster, and it seems that had I use the optional argument of
\contitemit would have been fine.If you don't mind me asking: why does
– Rui Apóstolo Oct 08 '18 at 10:43\contitemfail on a 3 line paragraph when it defaults to 100, does it have to do with the combination of word lengths and column widths?insboxand that one fails (I assume because of the different spacing initemizeenvironments, but am not completely sure atm). If time (and the original author) permits I'll try to write a package using a similar approach asinsboxto solve the problem in LaTeX (which will then hopefully be list aware). I'm currently reading the sources ofwrapfigand plan to read the sources of other packages resolving around text-floating as well. – Skillmon Oct 08 '18 at 11:27