ListView自定义适配器报错:addView(View, LayoutParams)不支持咨询
解决Android InflateException: addView(View, LayoutParams) is not supported错误
咱们先把这个错误的核心说透:你遇到的这个异常,大概率是布局结构冲突,或者自定义Adapter加载列表项的方式不对导致的。结合你用自定义Adapter给ListView填充道路施工信息的场景,下面是最常见的排查和解决方向:
1. 先查主布局有没有把ListView嵌套在ScrollView里
这是新手最容易踩的坑!如果你的MainActivity布局里,ListView被放在ScrollView(或NestedScrollView)里面,系统会直接抛出这个错误——因为ListView本身就是可滚动容器,Android不支持这种嵌套(会引发滚动逻辑冲突,系统直接阻止这种非法嵌套)。
解决办法:
- 直接移除ScrollView,把ListView作为主布局的子View,要是有固定的头部/尾部内容,用LinearLayout、ConstraintLayout这类布局把它们和ListView放在一起就行。
- 要是必须保留滚动容器(比如顶部有固定标题栏),可以换成
RecyclerView替代ListView,配合NestedScrollView使用时记得加一行代码:recyclerView.setNestedScrollingEnabled(false)。
2. 检查列表项的布局文件
如果你的列表项布局用了merge标签当根节点,但在inflate的时候参数传错了,也会触发这个错误。另外,要是列表项布局里又嵌套了ListView这类AdapterView,同样会出问题。
解决办法:
- 用了
merge标签的话,在Adapter的getView方法里inflate布局时,一定要传对父容器和attachToRoot参数:
这里View itemView = LayoutInflater.from(context).inflate(R.layout.your_roadwork_item, parent, false);attachToRoot必须设为false,因为ListView会自己处理子View的添加逻辑,不用咱们手动绑定到父容器。 - 确保列表项的根布局是普通ViewGroup(比如LinearLayout、ConstraintLayout),别嵌套ListView或其他AdapterView。
3. 检查自定义Adapter的getView写法
要是你在getView里手动调用了父容器的addView方法,而不是返回View让ListView自动添加,也会触发这个错误——因为ListView作为AdapterView,只能通过Adapter管理子View,不允许直接调用addView。
正确的getView示例:
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { // 正确加载布局,attachToRoot设为false convertView = LayoutInflater.from(mContext).inflate(R.layout.item_roadwork_info, parent, false); holder = new ViewHolder(); holder.workTitle = convertView.findViewById(R.id.tv_work_title); holder.workDate = convertView.findViewById(R.id.tv_work_date); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 绑定道路施工数据 RoadworkInfo item = mRoadworkList.get(position); holder.workTitle.setText(item.getWorkTitle()); holder.workDate.setText(item.getPlanDate()); return convertView; } // 用ViewHolder优化列表性能 static class ViewHolder { TextView workTitle; TextView workDate; }
4. 直接定位布局文件第54行
错误提示明确指向了XML文件的第54行,你直接打开对应的布局文件(应该是activity_main.xml)看这一行:
- 是不是在这里试图给ListView直接加子View?
- 是不是这个位置的View有非法嵌套?
- 是不是布局参数设置得不对?
比如如果第54行是ListView的定义,就检查它的父容器是不是ScrollView;如果是某个子View的定义,就检查它和父容器的兼容性。
内容的提问来源于stack exchange,提问作者DMcDonald
相关产品推荐
相关产品推荐

