[android]当试图填充崩溃与 AsyncLayoutInflater view 与数据

标签: Java Android
发布时间: 2017/3/19 18:22:11
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个自定义 ViewGroup 和我试着 inflate 它异步,它的崩溃与以下︰ Process : com.xxx.xxx.debug,PID: 9391 java.lang.IllegalStateException︰ 已经具有父元素指定的子级。首先你必须调用 removeView() 上儿童的家长。

                                                                                       Process: com.xxx.xxx.debug, PID: 9391
                                                                                         java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

AsyncLayoutInflater asyncLayoutInflater = new AsyncLayoutInflater(this.getContext());
    asyncLayoutInflater.inflate(R.layout.my_row, myLayout,
                                new AsyncLayoutInflater.OnInflateFinishedListener() {
                                    @Override
                                    public void onInflateFinished(View view, int resid, ViewGroup parent) {
                                        for (int i = 0; i < myData.size(); i++) {
                                            TextView myTextView = (TextView) view.findViewById(android.R.id.text1);
                                            tagTextView.setText(myData.get(i).getName());
                                            ImageView myIcon = (ImageView) view.findViewById(android.R.id.icon);
                                            picasso.load(myData.get(i).getIcon()).into(myIcon);
                                            parent.addView(view);
                                        }
                                    }
                                });

解决方法 1:

你打电话 parent.addView(view) 你的循环内。在那之后 View 已添加第一个 time 通过,您不能添加它再一次,因此该异常。

每个 inflate() 调用膨胀只有一个 View ,其中可以添加到其父只有一次。如果你想去 inflate 多个 my_row 实例,你就只好叫 inflate() 的每一次。

一个可能的解决方法是移动到环 inflate() 调用,并保持 int 字段来跟踪哪些行被传递到 onInflateFinished() 方法。因为 inflate 在排队的请求 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);
}

如果你不需要扣除通货膨胀后的数据集合,而是可以删除每个 element 从一开始的集合作为它用,并放弃行计数器,它可能会干净一点。

官方微信
官方QQ群
31647020