Android 使用ItemTouchHelper.SimpleCallback拖放RecyclerView中的列表项时,ChildHelper.java中的视图不是子级错误

Android 使用ItemTouchHelper.SimpleCallback拖放RecyclerView中的列表项时,ChildHelper.java中的视图不是子级错误,android,android-recyclerview,Android,Android Recyclerview,我正在使用ItemTouchHelper.SimpleCallback向我的RecyclerView添加拖放功能,但是在拖动项目后,它会随机崩溃。有时它会发生在我第一次拖动项目之后,但是有时我会坐在那里几分钟,只是移动项目,试图复制它,而没有运气。列表项布局xml使用ConstraintLayout作为根视图。RecyclerView位于我使用TableLayout导航到的片段中。我试着查找错误,但找不到关于它的更多信息 这里是错误 E/AndroidRuntime: FATAL EXCEPTI

我正在使用ItemTouchHelper.SimpleCallback向我的RecyclerView添加拖放功能,但是在拖动项目后,它会随机崩溃。有时它会发生在我第一次拖动项目之后,但是有时我会坐在那里几分钟,只是移动项目,试图复制它,而没有运气。列表项布局xml使用ConstraintLayout作为根视图。RecyclerView位于我使用TableLayout导航到的片段中。我试着查找错误,但找不到关于它的更多信息

这里是错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ferox.bracket, PID: 12379
    java.lang.IllegalArgumentException: view is not a child, cannot hide android.support.constraint.ConstraintLayout{45c7cc V.E...... ......ID 0,-231-1080,-81 #7f0900a8 app:id/participant_parent_layout}
        at android.support.v7.widget.ChildHelper.unhide(ChildHelper.java:352)
        at android.support.v7.widget.RecyclerView$Recycler.getScrapOrHiddenOrCachedHolderForPosition(RecyclerView.java:6393)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5896)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557) 
        at ...
我的ItemTouchHelper:

this.helper = new ItemTouchHelper(new ItemTouchHelper
.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.START) {

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, 
        @NonNull RecyclerView.ViewHolder viewHolder, 
        @NonNull RecyclerView.ViewHolder target) {

    int movedPosition = viewHolder.getAdapterPosition();
    int targetPostition = target.getAdapterPosition();

    swapSeed(players.get(movedPosition), players.get(targetPostition));
    Collections.swap(players, movedPosition, targetPostition);

    notifyItemMoved(movedPosition, targetPostition);
    notifyItemChanged(targetPostition);
    notifyItemChanged(movedPosition);

    return true;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
    int position = viewHolder.getAdapterPosition();

    new AlertDialog.Builder(viewHolder.itemView.getContext()).setMessage("Delete participant?")
            .setPositiveButton("Yes", (dialog, which) -> {
                players.remove(position);
                notifyItemRemoved(position);
            })
            .setNegativeButton("No", (dialog, which) -> {
                defaultItemAnimator.setSupportsChangeAnimations(true);
                notifyItemChanged(position, null);
            })
            .create().show();
    }


    @Override
    public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
    return .7f;
    }

    @Override
    public float getSwipeEscapeVelocity(float defaultValue) {
    return super.getSwipeEscapeVelocity(5f * defaultValue);
    }

    @Override
    public boolean isLongPressDragEnabled() {
    return false;
    }
}))

我的片段的OnCreate:

    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Intent intent = getActivity().getIntent();
    View v = inflater.inflate(R.layout.fragment_participants, container, false);
    CustomLinearLayoutManager linearLayoutManager = new CustomLinearLayoutManager(getContext(), RecyclerView.VERTICAL, false);

    DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator();
    defaultItemAnimator.setSupportsChangeAnimations(false);

    adapter = new RecyclerViewAdapter(getContext(), players, linearLayoutManager, defaultItemAnimator);

    recyclerView = v.findViewById(R.id.participant_list);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setItemAnimator(defaultItemAnimator);
    recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));
    recyclerView.setAdapter(adapter);
    adapter.getHelper().attachToRecyclerView(recyclerView);

    url = intent.getStringExtra("tournamentURL");
    ChallongeRequests.sendGet(response -> initPlayerList(response), ChallongeRequests.participantIndex(url));
    return v;
}
编辑:这似乎只发生在滚动一些未确定的数量,同时拖动一个viewholder之后。我已将DefaultItemAnimator.setSupportsChangeAnimations()设置为false,并已停止获取错误。但是,这会产生另一个问题,即当要求在刷卡后删除列表项时单击“否”,notifyItemChanged不会将视图滑回原位。我可以根据需要在代码中设置setSupportsChangeAnimations()的开和关来解决这个问题,但我觉得recyclerview的默认行为不应该导致这个错误。我不确定我是否应该对itemanimator做一些我还没有做的事情或者什么