Android LayoutInflater.inflate创建View时遇到的坑

项目中需要在一排显示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());
}

运行效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值