Где находится код, который управляет повторным использованием View в Android? - PullRequest
3 голосов
/ 30 января 2011

Где находится исходный код, который управляет View повторным использованием в Android? Я могу думать о трех отдельных частях этого процесса, но может быть и больше:

  1. Логика, которая определяет, имеет ли View право на повторное использование
  2. Код, который управляет пулами View с, которые можно использовать повторно
  3. Код, который удаляет повторно используемый View из пула и сбрасывает значения его свойств для представления логически различных View

РЕДАКТИРОВАТЬ: Сообщение в блоге Разработка приложений для Android - уловки и причуды приводит следующий пример:

public class PencilWise extends ListActivity {
    View activeElement;
    // ...
    @Override
    public void onCreate ( Bundle savedInstanceState ) {
        // ...
        this.getListView( ).setOnItemClickListener ( new OnItemClickListener ( ) {
            public void onItemClick ( AdapterView<?> parent, View view, int position, long id ) {
                MyActivity.this.activeElement = view;
                MyActivity.this.showDialog ( DIALOG_ANSWER );
            }
        } );
    }
}

Метод showDialog отображает диалоговое окно с ответом, в котором необходимо знать, какой вопрос открыл пользователь. Проблема в том, что к моменту открытия диалога представление, переданное в onItemClick, могло бы быть повторно использовано, и поэтому activeElement больше не будет указывать на элемент, по которому пользователь щелкнул, чтобы открыть диалоговое окно в первую очередь!

Ответы [ 2 ]

3 голосов
/ 04 февраля 2011

Переработка представлений выполняется AbsListView и их подклассами ListView и GridView.Вы можете найти исходный код этих классов здесь: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget

Начните с ListView и AbsListView.

1 голос
/ 04 февраля 2011

Я думаю, хороший пример того, что вы ищете, находится во внутреннем классе AbsListView.RecycleBin, расположенном в пакете widget.
Вы можете увидеть код онлайн здесь: https://android.googlesource.com/platform/frameworks/base/+/android-2.2_r1.1/core/java/android/widget/AbsListView.java#3888

Вот выдержка из документации:

RecycleBin облегчает повторное использование представлений в макетах. Корзина имеет два уровня хранение: ActiveViews и ScrapViews. ActiveViews - это те виды, которые были на экране начало макета. По построению они отображают текущую информацию. В конце макет, все представления в ActiveViews понижены до ScrapViews. ScrapViews - это старые представления, которые потенциально может использоваться адаптером, чтобы избежать ненужного распределения представлений.

...