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);
}