Все становится немного сложнее, когда вы понимаете, что во всем, что происходило до этого момента в этой главе, мы никогда не изменяли сам ListView. Вся наша работа была связана с адаптерами, переопределением getView() и раздуванием наших собственных строк и тому подобным.
Поэтому, если мы хотим, чтобы RateListView принимал любой обычный ListAdapter и "просто работал", размещая флажки в строках по мере необходимости, нам придется проделать некоторую причудливую работу. В частности, нам нужно будет обернуть "сырой" ListAdapter в другой ListAdapter, который знает, как помещать флажки в строки и отслеживать состояние этих флажков.
Сначала нам нужно создать схему, в которой один ListAdapter будет дополнять другой. Вот код AdapterWrapper, который принимает ListAdapter и делегирует все методы интерфейса делегату (из проекта-образца FancyLists/RateListView).
Затем мы можем подклассифицировать AdapterWrapper для создания RateableWrapper, переопределив стандартную getView(), но в остальном позволив делегированному ListAdapter выполнять "настоящую работу":"