项目中需要在一排显示5个相同的控件,使用RecyclerView嫌麻烦就直接往LinearLayout中加了5个View:
for(int i = 0; i < 5; i++) {
child[i] = mLayoutInflater.inflate(R.layout.layout_topcoverset, container, true);
child[i].setTag(i);
((TextView)child[i].findViewById(R.id.topcover_name)).setText(getString(R.string.publicity_pic) + "-" + Integer.toString((i + 1)));
Log.d(TAG, ((TextView)child[i].findViewById(R.id.topcover_name)) + " " + ((TextView)child[i].findViewById(R.id.topcover_name)).getText());
}
运行后发现效果成了这个样子:
查看Log发现mLayoutInflater.inflate返回的都是同一个view:
07-12 11:47:21.607 10948 10948 D TopCoverSetActivity: android.support.v7.widget.AppCompatTextView{6172b04 V.ED..... ......ID 0,0-0,0 #7f0902e7 app:id/topcover_name} 顶部宣传图-1
07-12 11:47:21.609 10948 10948 D TopCoverSetActivity: android.support.v7.widget.AppCompatTextView{6172b04 V.ED..... ......ID 0,0-0,0 #7f0902e7 app:id/topcover_name} 顶部宣传图-2
07-12 11:47:21.611 10948 10948 D TopCoverSetActivity: android.support.v7.widget.AppCompatTextView{6172b04 V.ED..... ......ID 0,0-0,0 #7f0902e7 app:id/topcover_name} 顶部宣传图-3
07-12 11:47:21.613 10948 10948 D TopCoverSetActivity: android.support.v7.widget.AppCompatTextView{6172b04 V.ED..... ......ID 0,0-0,0 #7f0902e7 app:id/topcover_name} 顶部宣传图-4
07-12 11:47:21.614 10948 10948 D TopCoverSetActivity: android.support.v7.widget.AppCompatTextView{6172b04 V.ED..... ......ID 0,0-0,0 #7f0902e7 app:id/topcover_name} 顶部宣传图-5
查看LayoutInflater源码发现只有在inflate的参数中传入ViewGroup为空或者attachToRoot为false是才返回新创建的view,其他情况下返回的是传入的ViewGroup。
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
synchronized (mConstructorArgs) {
......
View result = root;
try {
......
if (TAG_MERGE.equals(name)) {
......
} else {
......
if (root == null || !attachToRoot) {
result = temp;
}
}
} catch (XmlPullParserException e) {
......
}
return result;
}
}
所以在5次调用child[i].findViewById(R.id.topcover_name)时相当于调用了5次container.findViewById(R.id.topcover_name),始终返回的是第一次创建的layout_topcoverset中的topcover_name,因此出现了截图中的现象。
根据分析重新修改代码:
for(int i = 0; i < 5; i++) {
child[i] = mLayoutInflater.inflate(R.layout.layout_topcoverset, container, false);
child[i].setTag(i);
((TextView)child[i].findViewById(R.id.topcover_name)).setText(getString(R.string.publicity_pic) + "-" + Integer.toString((i + 1)));
Log.d(TAG, ((TextView)child[i].findViewById(R.id.topcover_name)) + " " + ((TextView)child[i].findViewById(R.id.topcover_name)).getText());
}
运行效果: