Где находится код, который управляет повторным использованием View в Android?


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

  1. логика, определяющая, имеет ли View право на повторное использование
  2. код, управляющий пулами Views, которые могут быть повторно использованы
  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

2 ответа:

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

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

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

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

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