Подробно объяснять долго, но смотреть надо в сторону чего-то типа ArrayAdapter (или CursorAdapter — смотря откуда данные для списка берутся). Пишется отдельный xml для элемента списка, потом адаптер для каждого элемента создает соответствующий View и заполняет его данными. Ключевые слова для поиска примеров: ListView, ArrayAdapter, getView (это метод адаптера, который и нужно перегрузить).
С кнопками в элементе списка, вроде, тоже была какая-то хитрость, но подробностей сейчас не помню. Вроде, надо было как-то правильно выставить свойства списка и элемента, чтобы нажимались именно кнопки, а не весь элемент сразу.