ListView列表-引用变量还是对象?

时间:2019-07-10 23:49:11

标签: java android findviewbyid setcontentview

当我创建一个类时,假设A a = new A(); 应该创建实际的对象并为其分配内存,我必须执行以下过程:

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

现在,通过变量a,我可以直接引用该对象。

但是,当我有情况时:

* { text-size-adjust: 200%; }

#navigation{
    background-color: white;
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25)
}

#navigation ul{
    display: flex;
}

#navigation a{
    color: black;
    text-decoration: none;
    font-size: 25px;
}

#navigation a:visited{
    color: black;
}

在列表变量声明期间是否创建了对象?有人可以对此发表评论吗?因为有了这个陈述,我在一个教程中认识了。

2 个答案:

答案 0 :(得分:3)

所有变量都引用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,因此列表现在引用{{ 1}}对象。

如果您想更清楚地了解它,建议阅读ListView中的相关章节,以清楚地阐明这种关系。

答案 1 :(得分:1)

@LiuWenbin_NO的回答完美地描述了这种情况。但是,我认为我可能会为此提供更多信息。

setContentViewView的{​​{1}}函数中调用时创建onCreate实例。它使用布局资源ID或单个Activity作为参数并扩大视图。为了更清楚地理解,仅View就足以让您的setContentView用您在布局文件中设计的静态视图填充Android屏幕?因此,如果要修改布局中的某些内容,则可以引用视图并相应地修改视图。

Activity仅创建Listview list;类型的变量(请注意,每个布局实例都扩展了ListView)。调用View函数后,它将创建膨胀视图的引用,并使用setContentView,您将获得这些视图的引用。

以前,我们必须在使用findViewById时强制转换为特定的视图类型,这对于较新版本的Android SDK而言不是必需的。因此,当您声明findViewById时不会创建该对象,而是在调用ListView list时创建的。

如果您要先创建视图实例,然后再对其进行充气,则也可以使用setContentView进行操作。例如,看下面的代码。

setContentView

通过这种方式,您只能将单个视图实例传递给TextView tv = new TextView(this); setContentView(tv); // Modify the TextView? tv.setText("Hello there"); 函数。因此,要获得具有多个控件的复杂布局,您需要使用布局。

setContentView中使用布局资源会使应用程序逻辑与表示层脱钩。

我强烈建议this book以便更好地理解。