为何TextView变量需置于循环内?两段代码正误解析
为什么循环内外创建TextView会导致不同结果?
嘿,这个问题是Android新手很容易踩的坑,我给你拆解得明明白白:
先看两段代码对比
错误代码
TextView wordview=new TextView(this); for(int i=0;i<english.size();i++) { wordview.setText(english.get(i)); x.addView(wordview); }
正确代码
for(int i=0;i<english.size();i++) { TextView wordview=new TextView(this); wordview.setText(english.get(i)); x.addView(wordview); }
核心原因:对象实例的唯一性
你仔细看,第一段代码里,TextView wordview是在循环外面创建的——这意味着整个循环过程中,你手里只有一个TextView对象。每次循环你只是修改这个对象的文本内容,然后试图把它加到LinearLayout里。但Android的View系统有个关键规则:一个View对象不能同时被添加到父布局多次。
具体发生的事情是这样的:
- 第一次循环:你给这个唯一的TextView设置了
english的第一个元素文本,然后把它加到LinearLayout里 - 第二次循环:你把同一个TextView的文本改成
english的第二个元素,再尝试添加到LinearLayout——但这个View已经在布局里了,Android内部会忽略重复添加的操作,同时因为你修改了这个唯一实例的文本,布局里的那个View显示的内容也会跟着变成新的 - 循环结束后,LinearLayout里只会有这一个TextView,显示的是
english的最后一个元素内容
而第二段代码是在循环内部创建TextView:每一次循环都会新建一个完全独立的TextView对象,每个对象都有自己的文本内容,然后把这些不同的对象依次加到LinearLayout里。这样一来,LinearLayout里就会有和english长度一样多的TextView,每个都显示对应的文本,这才是你想要的效果。
为啥要把TextView创建放在循环内?
- 每个列表条目都需要独立的View实例:屏幕上的每个UI元素都是对应一个独立的对象,它们的状态(文本、样式、位置等)都是各自独立的,不能共用一个实例
- 避免覆盖与重复添加:同一个View实例的状态修改会同步到它在布局里的显示,而且重复添加同一个View到父布局不会生成多个副本,只会保留最后一次修改的状态
内容的提问来源于stack exchange,提问作者Amandeep Kumar
相关产品推荐
相关产品推荐

