我用RecyclerVIew实现一个宫格样式,中间一项itemtype不同作为标题分割,添加了拖拽ItemTouchHelper,但是当我拖拽越过中间的标题时,标题前后的item移动动画变成淡入淡出,并且标题会闪烁一下。请问是为什么?
public class MyItemTouchHelper extends ItemTouchHelper.Callback{
private List<MenuInfo> pictureBeans;
private ModuleAdapter recycleViewAdapter;
Activity activity;
public MyItemTouchHelper(Activity activity, List<MenuInfo> pictureBeans, ModuleAdapter recycleViewAdapter) {
Log.d("dddd","into MyItemTouchHelper");
this.pictureBeans = pictureBeans;
this.recycleViewAdapter = recycleViewAdapter;
this.activity = activity;
}
private boolean canSwipe(RecyclerView.ViewHolder viewHolder){
if(viewHolder instanceof ViewHolderSplite){
return false;
}else{
return true;
}
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
if(canSwipe(viewHolder)){
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}else{
return makeMovementFlags(0, 0);
}
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
if(target instanceof ViewHolderSplite){
return false;
}
recyclerView.getParent().requestDisallowInterceptTouchEvent(true);
//得到当拖拽的viewHolder的Position
int fromPosition = viewHolder.getAdapterPosition();
//拿到当前拖拽到的item的viewHolder
int toPosition = target.getAdapterPosition();
if (fromPosition < toPosition) {
//从前面到后面
for (int i = fromPosition; i < toPosition; i++) {
if(isHeader(i + 1)){//如果与标题替换,跳过
Collections.swap(pictureBeans, i, i + 2);
i++;
}else{
Collections.swap(pictureBeans, i, i + 1);
}
}
} else {
//从后面到前面
for (int i = fromPosition; i > toPosition; i--) {
if(isHeader(i - 1)){//如果与标题替换,跳过
Collections.swap(pictureBeans, i, i - 2);
i--;
}else{
Collections.swap(pictureBeans, i, i - 1);
}
}
}
// 通知Adapter数据项已移动
recycleViewAdapter.notifyItemMoved(fromPosition, toPosition);
Log.d("dddd"," fromPosition = "+fromPosition+" toPosition"+toPosition);
return true;
}
private boolean isHeader(int index){
if(pictureBeans.get(index).itemType == MenuInfo.ITEM_TYPE_SPLITE){
return true;
}
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
/**
* 长按选中Item时修改颜色
*
* @param viewHolder
* @param actionState
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
//if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
//viewHolder.itemView.setBackground(getDrawable(R.drawable.card_drag_selected));
//}
super.onSelectedChanged(viewHolder, actionState);
}
/**
* 手指松开的时候还原颜色
* @param recyclerView
* @param viewHolder
*/
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
//viewHolder.itemView.setBackground(getDrawable(R.drawable.card));
}
}
相似问题