Единый элемент для вывода аудио/видео/фото?
Попробуйте ViewStub. В зависимости от того, какой файл пришёл с предыдущего экрана, будете инфлейтить разные макеты (для аудио/фото/видео) и работать с ними.
Можно даже выделить три разных кастомных виджета, реализающих один общий интерфейс MediaFileHandler. В этом интерфейсе будет метод handleFile(File). При попадании на экран с выводом медиа вы инфлейтите соответствующий layout, содержащий ваш кастомный виджет, и вызываете у виджета handleFile().
Есть ли какое либо "красивое" решение подобной задачи?
Есть, создать свой кастомный View, внутри которого скрыть всю это не радующую глаз логику.
Поверьте мне, на самом деле костылей в вашем коде гораздо больше. Если вы хоть раз печатали findViewById пальцами по клавиатуре, то это тоже костыль по сравнению с кое-чем. Да, есть такая параллельная вселенная, где это делается автоматически))
Так что, надо расставлять приоритеты, и смотреть на вещи реально, потому что все костыли сразу - не победить.