After having fiddled around with callback functions for several hours, I stumbled upon this very nice function:
archive_filter_bytes(struct archive *, int)
The function returns the number of bytes read from the archive and thus can be used for computing progress of listing an archive. The second argument is -1 for the outmost filter (see archive.h in libarchive source). The progress can now be calculated with this simple two-line patch.