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