Ciphers are either block ciphers or stream ciphers. Stream ciphers process data byte by byte whereas block ciphers process them block by block.
Block ciphers can only encrypt entire blocks. E.g. AES can only encrypt 16 byte input to 16 byte output (regardless if AES-128, AES-192 or AES-256, this number just refers to the key length, not to the block size). The downside of block ciphers is that if you need to encrypt something that is not exactly as large as the block size, you need some kind of block chaining.
Asymmetric ciphers are actually block ciphers as well, so you can use them to encrypt any kind of data and also of any length using block chaining. However, asymmetric encryption is very slow and not intended to encrypt large amounts of data. Using them with block chaining for large amounts of data may open up possibilities for timing attacks, allowing to make educated guesses about the private key.
That's why one usually generates a random key, encrypts all data using that random key and a symmetric block cipher with chaining and in the end, encrypts only that random key using asymmetric encryption. That way the recipient of the data can simply decrypt the random key using his private key and then decrypt the rest of data with it. This hybrid approach has no disadvantage as long as the symmetric algorithm is at least as secure as the asymmetric one but it has plenty of advantages over just using asymmetric encryption.
Here is a Java implementation of ECIES using Curve25519. The data is encrypted using AES-256 with CBC chaining, then the AES key itself is encrypted using Curve25519 as described by ECIES.