我有一个自定义ViewGroup,我正在尝试将其异步,它崩溃了以下内容: 处理:com.xxx.xxx.debug,PID:9391 java.lang.IllegalStateException:指定的子级已有父级。您必须首先在孩子的父母身上调用removeView()。
Child firstChild = new Child();
firstChild.title = "First Child";
firstChild.description = "Description 1";
firstChild.link1 = "link1";
firstChild.link2 = "link2";
List<Child> childList = new ArrayList<>();
childList.add(firstChild);
答案 0 :(得分:1)
你在循环中调用parent.addView(view)
。在第一次添加View
之后,您无法再次添加它,因此异常。
每个inflate()
调用只会膨胀一个View
,只能将其添加到其父级一次。如果您想要扩充多个my_row
个实例,则必须为每个实例调用inflate()
一次。
一种可能的解决方案是将循环移至inflate()
调用周围,并保留int
字段以跟踪传递给onInflateFinished()
方法的行。由于膨胀请求在AsyncLayoutInflater
中排队,因此它们将按顺序完成。
例如,首先声明行计数器和OnInflateFinishedListener
。
private int row;
private final AsyncLayoutInflater.OnInflateFinishedListener inflateListener =
new AsyncLayoutInflater.OnInflateFinishedListener() {
@Override
public void onInflateFinished(View view, int resid, ViewGroup parent) {
TextView myTextView = (TextView) view.findViewById(android.R.id.text1);
myTextView.setText(myData.get(row).getName());
ImageView myIcon = (ImageView) view.findViewById(android.R.id.icon);
picasso.load(myData.get(i).getIcon()).into(myIcon);
parent.addView(view);
row++;
}
};
然后按如下方式修改循环和inflate()
块。
row = 0;
for (int i = 0; i < myData.size(); i++) {
asyncLayoutInflater.inflate(R.layout.my_row, myLayout, inflateListener);
}
如果你在通货膨胀后不需要数据收集,你可以在使用时从集合的开头删除每个元素,并放弃行计数器,这可能会更清洁。