java - 尝试用数据填充 View 时 AsyncLayoutInflater 崩溃

标签 java android asynchronous layout-inflater

我有一个自定义的 ViewGroup,我正试图将其异步膨胀,它因以下原因而崩溃: 进程:com.xxx.xxx.debug,PID:9391 java.lang.IllegalStateException: 指定的 child 已经有一个 parent 。您必须先对 child 的 parent 调用 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);
                                        }
                                    }
                                });

最佳答案

您正在循环中调用 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() block 如下。

row = 0;

for (int i = 0; i < myData.size(); i++) {
    asyncLayoutInflater.inflate(R.layout.my_row, myLayout, inflateListener);
}

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

关于java - 尝试用数据填充 View 时 AsyncLayoutInflater 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41784779/

相关文章:

android - Ionic native 应用程序正在发送 header Origin :file://which causes problems

asynchronous - 如何最好地实现阻塞/等待 Actor ?

java - 捕获 Windows 中的击键

java - 为eclipse添加spring资源

java - 7'' 平板电脑的 android xlarge 布局

Android- ListView 、服务媒体播放器和 boolean 标志

javascript - 尝试从 JSON 文件返回 URL

Node.js Web 服务器 fs.createReadStream 与 fs.readFile?

java - Java将2D数组信息转换为关键的摘要

java - 如何使用 SQL-lite 数据库检索 android studio 中的单选按钮组