尝试使用数据填充视图时,使用AsyncLayoutInflater崩溃

时间:2017-01-21 21:35:07

标签: java android asynchronous layout-inflater

我有一个自定义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);

1 个答案:

答案 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);
}

如果你在通货膨胀后不需要数据收集,你可以在使用时从集合的开头删除每个元素,并放弃行计数器,这可能会更清洁。