DataBinding With RecyclerView异常:父视图存在
DataBinding With RecycleView Exception: ParentView is existed
当我尝试将 DataBinding 与 Recycle View 一起使用或任何情况下都需要膨胀时,我非常想知道 DataBinding layout.xml
我正在尝试将回收视图与 layout.xml 连接起来,后者与 DataBinding 对象相连。我做了这些步骤。
1) 回收视图持有人。
public class StepperViewHolder extends RecyclerView.ViewHolder{
public final StepperViewBinding STEPPER_VIEW;
StepperViewHolder(@NonNull StepperViewBinding stepperViewBinding) {
super(stepperViewBinding.getRoot());
STEPPER_VIEW = stepperViewBinding;
}
}
2) OnCreateViewHolder
@Override
public StepperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
StepperViewBinding stepperViewBinding = DataBindingUtil.setContentView(mActivity, R.layout.stepper_view);
return new StepperViewHolder(stepperViewBinding);
}
现在,这个异常正在抛出。
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:4309)
at android.view.ViewGroup.addView(ViewGroup.java:4145)
at android.view.ViewGroup.addView(ViewGroup.java:4086)
at android.support.v7.widget.RecyclerView.addView(RecyclerView.java:746)
at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
注意
当我尝试通过 DataBinding 视图使用类似于回收视图进程的库时,我以前也遇到过这个异常。
如果在 addView()
方法 [Within library code] 之前存在视图父级,我通过删除视图父级来解决此异常。
在这个异常中,同样的错误发生在 addView()
方法中。
那么为什么会发生这种情况,我该如何避免呢?
除此之外,我尝试在将视图父级传递给 ViewHolder 之前将其删除,回收视图也同样有效,这两种方法 onCreateView()
- onBindView()
都被调用,但在移动屏幕上没有视图可显示!!!
这是我遵循的步骤:-
1)
private void checkParentView(StepperViewBinding stepperViewBinding){
if(stepperViewBinding.getRoot().getParent() != null){
((ViewGroup)stepperViewBinding.getRoot().getParent()).removeView(stepperViewBinding.getRoot());
}
}
2)
@Override
public StepperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
StepperViewBinding stepperViewBinding = DataBindingUtil.setContentView(mActivity, R.layout.stepper_view);
// To avoid IllegalStateException.
// State: The specified child already has a parent. You must call removeView() on the child's parent first.
checkParentView(stepperViewBinding);
return new StepperViewHolder(stepperViewBinding);
}
已解决
通过这种方式创建绑定视图的实例。
StepperViewBinding stepperViewBinding = DataBindingUtil.inflate(LayoutInflater.from(mActivity),
R.layout.stepper_view, parent, false);
我相信你用错了DataBindingUtil
的方法。通过阅读文档,仅当您想要更改 Activity
的内容视图时才应使用 setContentView()
,这不适用于 RecyclerView
。相反,我认为你应该使用 the inflate()
method:
@Override
public StepperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
StepperViewBinding stepperViewBinding = DataBindingUtil.inflate(inflater, R.layout.stepper_view, parent, false);
return new StepperViewHolder(stepperViewBinding);
}
当我尝试将 DataBinding 与 Recycle View 一起使用或任何情况下都需要膨胀时,我非常想知道 DataBinding layout.xml
我正在尝试将回收视图与 layout.xml 连接起来,后者与 DataBinding 对象相连。我做了这些步骤。
1) 回收视图持有人。
public class StepperViewHolder extends RecyclerView.ViewHolder{
public final StepperViewBinding STEPPER_VIEW;
StepperViewHolder(@NonNull StepperViewBinding stepperViewBinding) {
super(stepperViewBinding.getRoot());
STEPPER_VIEW = stepperViewBinding;
}
}
2) OnCreateViewHolder
@Override
public StepperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
StepperViewBinding stepperViewBinding = DataBindingUtil.setContentView(mActivity, R.layout.stepper_view);
return new StepperViewHolder(stepperViewBinding);
}
现在,这个异常正在抛出。
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. at android.view.ViewGroup.addViewInner(ViewGroup.java:4309) at android.view.ViewGroup.addView(ViewGroup.java:4145) at android.view.ViewGroup.addView(ViewGroup.java:4086) at android.support.v7.widget.RecyclerView.addView(RecyclerView.java:746) at android.support.v7.widget.ChildHelper.addView(ChildHelper.java:107)
注意
当我尝试通过 DataBinding 视图使用类似于回收视图进程的库时,我以前也遇到过这个异常。
如果在 addView()
方法 [Within library code] 之前存在视图父级,我通过删除视图父级来解决此异常。
在这个异常中,同样的错误发生在 addView()
方法中。
那么为什么会发生这种情况,我该如何避免呢?
除此之外,我尝试在将视图父级传递给 ViewHolder 之前将其删除,回收视图也同样有效,这两种方法 onCreateView()
- onBindView()
都被调用,但在移动屏幕上没有视图可显示!!!
这是我遵循的步骤:-
1)
private void checkParentView(StepperViewBinding stepperViewBinding){
if(stepperViewBinding.getRoot().getParent() != null){
((ViewGroup)stepperViewBinding.getRoot().getParent()).removeView(stepperViewBinding.getRoot());
}
}
2)
@Override
public StepperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
StepperViewBinding stepperViewBinding = DataBindingUtil.setContentView(mActivity, R.layout.stepper_view);
// To avoid IllegalStateException.
// State: The specified child already has a parent. You must call removeView() on the child's parent first.
checkParentView(stepperViewBinding);
return new StepperViewHolder(stepperViewBinding);
}
已解决 通过这种方式创建绑定视图的实例。
StepperViewBinding stepperViewBinding = DataBindingUtil.inflate(LayoutInflater.from(mActivity),
R.layout.stepper_view, parent, false);
我相信你用错了DataBindingUtil
的方法。通过阅读文档,仅当您想要更改 Activity
的内容视图时才应使用 setContentView()
,这不适用于 RecyclerView
。相反,我认为你应该使用 the inflate()
method:
@Override
public StepperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
StepperViewBinding stepperViewBinding = DataBindingUtil.inflate(inflater, R.layout.stepper_view, parent, false);
return new StepperViewHolder(stepperViewBinding);
}