Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试用数据填充视图时,AsyncLayoutFlater崩溃_Java_Android_Asynchronous_Layout Inflater - Fatal编程技术网

Java 尝试用数据填充视图时,AsyncLayoutFlater崩溃

Java 尝试用数据填充视图时,AsyncLayoutFlater崩溃,java,android,asynchronous,layout-inflater,Java,Android,Asynchronous,Layout Inflater,我有一个自定义视图组,我正在尝试异步膨胀它,它崩溃如下: 进程:com.xxx.xxx.debug,PID:9391 java.lang.IllegalStateException:指定的子级已具有父级。必须首先对子级的父级调用removeView() Process: com.xxx.xxx.debug, PID: 939

我有一个自定义视图组,我正在尝试异步膨胀它,它崩溃如下: 进程: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);
                                        }
                                    }
                                });
进程:com.xxx.xxx.debug,PID:9391
java.lang.IllegalStateException:指定的子级已具有父级。必须首先对子级的父级调用removeView()。
AsyncLayoutFlater AsyncLayoutFlater=新的AsyncLayoutFlater(this.getContext());
充气(R.layout.my_row,myLayout,
新的AsyncLayoutFlater.OnInflateFinishedListener(){
@凌驾
public void onInflateFinished(视图、int resid、视图组父级){
对于(int i=0;i
您正在循环内调用
parent.addView(view)
。在第一次通过添加
视图
之后,您不能再添加它,因此会出现异常

每个
充气()。如果要为多个
my_row
实例充气,则必须为每个实例调用
inflate()
一次

一种可能的解决方案是将循环移动到
inflate()
调用周围,并保留一个
int
字段来跟踪哪个行正在被传递到
onInflateFinished()
方法。由于充气请求在
AsyncLayoutFlater
中排队,因此它们将按顺序完成

例如,首先声明行计数器和
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++;
        }
    };
然后修改循环和
充气()
块,如下所示

row = 0;

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

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

只向父视图添加一个视图,而实际目标是向父视图(布局)添加视图(子视图)对于每个
inflatefinished()
调用,只有一个
View
将被充气,而这一个
View
就是传递到
onInflateFinished()
中的内容。
视图
只能添加到其父视图一次。我以前没有意识到这一点,但是你的循环只是在同一个
视图上反复设置文本和图像。如果您想要多个
my_row
布局,那么您的逻辑有点不正确。您需要为需要创建的每一行调用
inflate()
。我整理了一个可能的解决方案,并将其编辑到答案中。我现在没有机会测试它,但它应该是好的。等我有机会的时候,我会复习和测试的。哦,你看到了。:-)让我知道你有什么问题。干杯我会尝试一下,我想我可能会为了我的目的而调整它,但你给了我正确的想法和正确的道路。干杯