问题是我想在 RecyclerView 中拖动该项目时对其执行提升。
根据文档所述,我应该在以下位置自定义拖动视图的行为ItemTouchHelper.Callback#onChildDraw https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html#onChildDraw(android.graphics.Canvas,%20android.support.v7.widget.RecyclerView,%20android.support.v7.widget.RecyclerView.ViewHolder,%20float,%20float,%20int,%20boolean)因为它说
如果您想自定义视图对用户交互的响应方式,这是一个覆盖的好地方。
然后我应该清除我的自定义ItemTouchHelper.Callback#clearView https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html#clearView(android.support.v7.widget.RecyclerView,%20android.support.v7.widget.RecyclerView.ViewHolder)因为它说
当用户与元素的交互结束并且它也完成其动画时由 ItemTouchHelper 调用。
但问题是onChildDraw
之后总会再被调用一次clearView
.
所以即使我清除了自定义行为clearView
,仍然会被重新调用onChildDraw
。那么目的是什么呢clearView
?
这是我的代码:
class MyItemTouchCallback extends ItemTouchHelper.Callback {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
// Set elevation for dragged itemView
ViewCompat.setElevation(viewHolder.itemView, getResources().getDimension(R.dimen.common_elevation));
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
// Clear elevation for dragged itemView
ViewCompat.setElevation(viewHolder.itemView, 0);
}
}