Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ItemTouchHelper with Multi ViewType

Tags:

android

public class ItemCallBack extends ItemTouchHelper.Callback {
private BaseDragAdapter adapter;
private List list;

public ItemCallBack(BaseDragAdapter adapter, List list) {
    this.adapter = adapter;
    this.list = list;
}

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlags = 0; 
    int swipeFlags = 0;  
    int startPosition = viewHolder.getAdapterPosition();
    if (startPosition != 0) {
        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        } else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        } else if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        }
    }
    return makeMovementFlags(dragFlags, swipeFlags);
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 
    int startPosition = viewHolder.getAdapterPosition();
    int targetPosition = target.getAdapterPosition();
    adapter.onMoved(startPosition, targetPosition);
    return true;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {  //左右拖动删除
    int position = viewHolder.getAdapterPosition();
    adapter.onSwiped(position);
}

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

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


@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
        viewHolder.itemView.setScaleX(1.2f);
        viewHolder.itemView.setScaleY(1.2f);
    }
    super.onSelectedChanged(viewHolder, actionState);
}

@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    viewHolder.itemView.setScaleX(1.0f);
    viewHolder.itemView.setScaleY(1.0f);
    onOrderListener.order();
}


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

private OnOrderListener onOrderListener;

public void setOnPictureClickListener(OnOrderListener onOrderListener) {
    if (onOrderListener != null) {
        this.onOrderListener = onOrderListener;
    }
}

public interface OnOrderListener {
    void order();
}

}

@Override
public int getItemViewType(int position) {
    if (position == 0) {
        return TYPE_ADD;
    } else if (position == 1) {
        return TYPE_COVER;
    }
    return TYPE_NORMAL;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == TYPE_ADD) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_upload_pic_add, null);
        return new AddHolder(view);
    } else if (viewType == TYPE_COVER) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_upload_pic_cover, null);
        return new CoverHolder(view);
    }  else {
        View view = LayoutInflater.from(context).inflate(R.layout.item_upload_pic_normal, null);
        return new NormalHolder(view);
    }
}

I wanna swap item with ItemTouchHelper.

The issue is:

When i drag and swap item that viewtype is TYPE_NORNAL,animation work well;
But When i try to switch between different types(ex:TYPE_NORMAL and TYPE_COVER),animation does not execute correctly.

How to make the animation execute correctly?

like image 453
Mr.Guo Avatar asked Oct 29 '22 12:10

Mr.Guo


1 Answers

I had the same issue. Resoved it with setting

setHasStableIds(true);

on adapter, and overriding getItemId() so that it returns unique id for each item I have in adapter. If you do not have unique id for items you can spawn Map and generate these id's when you get new items for adapter. Then lookup these id's in getItemId(), using item as a key.

like image 50
southerton Avatar answered Nov 15 '22 06:11

southerton