Где находится код, который управляет повторным использованием View в Android?
Где находится исходный код, который управляет повторным использованием View
в Android? Я могу думать о трех различных частях этого процесса, но их может быть больше:
- логика, определяющая, имеет ли
View
право на повторное использование - код, управляющий пулами
View
s, которые могут быть повторно использованы - код, который удаляет многократно используемый
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 ответа:
Я думаю, что хороший пример того, что вы ищете, находится во внутреннем классе
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
.