Список ListView - ссылочная переменная или объект? - PullRequest
2 голосов
/ 11 июля 2019

Когда я создаю класс, давайте предположим class A, что должен быть создан фактический объект и выделена ему память, я должен выполнить следующую процедуру:

A a = new A();

И в этот моментчерез переменную a я могу напрямую обратиться к объекту.

Однако, когда у меня возникает ситуация:

ListView list;
list = findViewById(R.id.listView);

Создается ли объект во время объявления переменной списка?Может ли кто-нибудь прокомментировать это?Потому что с этим утверждением я познакомился в одном уроке.

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

Все переменные ссылаются на объект в Java.

Для вашего примера:

ListView list;
list = findViewById(R.id.listView);

Первый оператор не будет создавать новый объект, то есть: findViewById не будет создаватьновый экземпляр ListView, фактически, объект ListView был создан во время фазы, когда вы вызываете setContentView(R.layout.xx), под капотом Android перебирается XML-макет и создается соответствующие объекты для каждого тега.

Поэтому после setContentView(xx) в памяти уже есть экземпляр ListView.

Когда вы выполняете list = findViewById(R.id.listview), метод findViewById возвращает ссылку на ListView и передает ссылку на list, поэтому список теперь относится к объекту ListView.

Если вы хотите узнать его более четко, я предлагаю прочитать соответствующую главу в Head First Java, в которой четко разъясняется эта взаимосвязь.

1 голос
/ 11 июля 2019

@ Ответ LiuWenbin_NO отлично описывает ситуацию.Тем не менее, я подумал, что мог бы добавить больше информации об этом

setContentView создает экземпляры View при вызове в функции onCreate Activity.Он принимает идентификатор ресурса макета или один View в качестве параметра и раздувает представление.Чтобы понять более четко, для вашего Activity достаточно только setContentView, чтобы экран Android заполнялся статическими представлениями, которые вы спроектировали в файле макета, верно?Следовательно, если вы хотите что-то изменить в своем макете, вы берете ссылки на свои виды и соответственно меняете их.

Listview list; создает только переменную типа ListView (обратите внимание, что все экземпляры макета расширяются View).Когда вы вызвали функцию setContentView, она создает ссылки на раздутые представления и, используя findViewById, вы просто получаете ссылки на них.

Ранее нам приходилось приводить к определенным типам представлений при использовании findViewById, что не требуется для более новых версий Android SDK.Следовательно, объект не был создан, когда вы объявили ListView list, он был создан, когда вы вызвали setContentView.

Если вы хотите сначала создать экземпляры ваших представлений, а затем хотите их раздувать, вы можете сделать это также с помощью setContentView.Например, взгляните на следующий код.

TextView tv = new TextView(this);
setContentView(tv); 

// Modify the TextView? 
tv.setText("Hello there");

Таким образом, вы можете передать только один экземпляр представления в функцию setContentView.Следовательно, чтобы получить сложный макет с несколькими элементами управления, вам нужно использовать макет.

Использование ресурсов макета с setContentView позволяет отделить логику вашего приложения от уровня представления.

Я настоятельно рекомендую эту книгу для лучшего понимания.

...