Java 尝试用数据填充视图时,AsyncLayoutFlater崩溃
我有一个自定义视图组,我正在尝试异步膨胀它,它崩溃如下: 进程:com.xxx.xxx.debug,PID:9391 java.lang.IllegalStateException:指定的子级已具有父级。必须首先对子级的父级调用removeView()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
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()
。我整理了一个可能的解决方案,并将其编辑到答案中。我现在没有机会测试它,但它应该是好的。等我有机会的时候,我会复习和测试的。哦,你看到了。:-)让我知道你有什么问题。干杯我会尝试一下,我想我可能会为了我的目的而调整它,但你给了我正确的想法和正确的道路。干杯