Сталкивался с подобной задачей, нужно было вывести дерево устройств со скрытием/раскрытием дочерних узлов. Долго искал готовое решение, но ничего подходящего так и не смог найти. Решил проблему очень просто, используя ListView, правда еще пришлось написать класс-обертку с методами для работы с деревом и расширить класс узла дополнительными полями (уровень вложенности; флаг, указывающий на скрытость/раскрытость узла).
Теперь перейдем к алгоритму.
1. Рекурсивным обходом дерева собираем ArrayList из раскрытых узлов, не забывая указывать уровень вложенности узлам, затем скармливаем этот ArrayList адаптеру.
2. В методе getView адаптера выставляем содержимому вьюшки отступ слева, пропорциональный уровню вложенности (или используем другой layout, для вложенных узлов, или еще как-то выделяем вложенные узлы).
3. По клику на иконку скрытия/раскрытия узла высталяем этому узлу соответствующий флаг. Затем, делаем все то же самое, что и в пункте 1, только не забывам вызвать метод notifyDataSetChanged() нашего адаптера.
Надеюсь, данная информация будет полезной.