Problem
So I have a recycler view populated by card views all with drag listeners attached, the motion events work fine until I set a view to be dragged, so with the line commented out this works, all logs are printed perfectly
holder.handleView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (MotionEventCompat.getActionMasked(event)){
case MotionEvent.ACTION_DOWN:
Log.d("Adptr" , "ACTION_DOWN");
holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation_pressed));
//mDragStartListener.onStartDrag(holder);
return true;
case MotionEvent.ACTION_UP:
Log.d("Adptr" , "ACTION_UP");
holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
break;
case MotionEvent.ACTION_CANCEL:
Log.d("Adptr" , "ACTION_CANCEL");
holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
break;
}
return false;
}
});
but if I uncomment the line
mDragStartListener.onStartDrag(holder);
then ACTION_UP is no longer called and I'm confused as to why
the listener is an interface
public interface OnStartDragListener {
void onStartDrag(RecyclerView.ViewHolder viewHolder);
}
I implement it in my activity and pass it to the adapter
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
mItemTouchHelper.startDrag(viewHolder);
}
My onMove method is this
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
RecyclerView.ViewHolder target) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
and in my adapter i have an onItemMove from an interface
public interface ItemTouchHelperAdapter {
boolean onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
if (fromPosition < toPosition){
for (int i = fromPosition; i < toPosition; i++){
Collections.swap(cardMakerList,i,i+1);
}
}else{
for (int i = fromPosition; i > toPosition; i--){
Collections.swap(cardMakerList,i,i-1);
}
}
notifyItemMoved(fromPosition,toPosition);
return true;
}