inflate视图返回旧的膨胀结果

时间:2015-05-06 17:04:04

标签: android

我尝试多次膨胀布局以插入另一个布局。这是代码:

    View oldView = null;
    for (ProfileServiceCategory.ProfileService service : profileServiceCategory.getServices()) {
        View view = LayoutInflater.from(context)
                .inflate(R.layout.profile_service_list_item, viewHolder.rootView);
        if(oldView == view) {
            Log.d("test", "Error");
        }
        oldView = view;

        TextView serviceName = (TextView) view.findViewById(R.id.profile_services_name);
        serviceName.setText(service.getServiceValue());
    }

我面临的问题是inflate方法返回的视图变量始终是第一个膨胀的视图。为了清楚起见,我添加了一个Log.d,如果一切按预期工作,它应该从未被调用,但它确实已经命中。

我检查了视图层次结构,我可以确定新的视图实际上已添加到rootView中,但我得到的参考是旧视图。

2 个答案:

答案 0 :(得分:1)

我的一位同事建议通过手动将视图添加到容器来解决此问题。这是编辑过的代码:

    LayoutInflater layoutInflater= LayoutInflater.from(context);    
    for (ProfileServiceCategory.ProfileService service : profileServiceCategory.getServices()) {    
        View view = layoutInflater.inflate(R.layout.profile_service_list_item, null);   

        TextView serviceName = (TextView) view.findViewById(R.id.profile_services_name);    
        serviceName.setText(service.getServiceValue()); 

        viewHolder.rootView.addView(view);  
    }

当null作为第二个参数传递给inflate方法时,每次都会返回一个新视图。可以通过addView方法将视图插入容器内。

这显然是android SDK中的一个错误。

答案 1 :(得分:-1)

LayoutInflater.from(context).inflate(R.layout.profile_service_list_item,
viewHolder.rootView);

始终返回相同的inflater服务。所以我认为你必须使用cloneInContext

获取layoutInflater的副本
View view = LayoutInflater.from(this)
                    .cloneInContext(R.layout.layout_fullscreen_image, viewHolder.rootView);