You could try this
String itemID;
int amount;
String splitID = itemID.split(":");
int dataValue = Integer.parseInt(splitID[2]);
String parsedID = splitID[0] + ":" + splitID[1];
Optional<ItemType> opType = Sponge.getRegistry().getType(ItemType.class, parsedID);
if(opType.isPresent()){
ItemStack item = ItemStack.builder().itemType(opType.get()).quantity(amount).build();
switch(dataValue){
case 0: item.offer(Key.SKULL_TYPE, SkullTypes.CREEPER); break;
case 1: item.offer(Key.SKULL_TYPE, SkullTypes.WITHER_SKELETON); break;
//ETC
}
}
The code is from memory and not tested, if it does not compile then consider it a way of going about it.
SpongePowered does not support data values due to the fact Minecraft is attempting to remove them. This has resulted to some really strange work arounds.
I advise you look at this thread where @gabizou (a sponge leader) talks about getting varients