Короче начни с того, что выкинь ListView. Забудь о нём, как будто его не существует. Он учит плохому, все эти ArrayAdapter'ы - зло, за ними не видно, как надо делать правильно.
Возьми RecyclerView. Он покажется тебе сложнее, но он заставит тебя делать правильнее.
Уйди от списка строк. Список строк это ничто, нет у строки "эспрессо" никакого состава. У тебя должна быть моделька, POJO, в котором хранятся твои данные для одного элемента списка. В твоём случае это одна строчка? Прекрасно, это будет класс с одним полем. Дальше ты в этот же класс добавишь ещё одно поле - айди(id) этого элемента. По айди ты должен уметь однозначно получать и имя, и список ингридиентов.
Дальше, когда ты напишешь кастомный адаптер к RecyclerView, тебе нужно будет проставить onClickListener на вьюхи. нажатия этого листенера ты должен прокинуть в свой интерфейс
interface CoffeeSelectionListener {
void onCoffeeSelected(int coffeeId);
}
Этот интерфейс-листенер должен приходить в твой адаптер снаружи, таким образом ты абстрагируешься от конкретного действия. И это хорошо.
Снаружи проставь листенер, и по айдишнику находи список ингридиентов. Дальше показывай его.
Упаси бог тебя показывать в AlertDialog'e. Возьми DialogFragment, потрать время, но сделай нормально. Никто уже не пользуется диалогами.
Когда ты это сделаешь у тебя получится чуть-чуть лучшего качества код. Дальше надо будет абстрагироваться ещё.