1

RecyclerView이 있고 ItemTouchHelperItemTouchHelper.Callback을 사용하여 끌어서 놓기 기능을 구현했습니다.ItemTouchHelper를 사용하여 RecyclerView에서 마우스 오버 이벤트

ItemTouchHelper.Callback 나는 콜백 메소드 onMove()을 가지고 있는데,이 뷰는 드래그 된 뷰가 대상 뷰 위로 드래그되고 스왑이 완료된 후에 호출됩니다.

내가 구현하려고하는 (또는 찾을) 스왑이 이루어지기 전에 드래그 한보기가 대상보기 위에있을 때 호출되는 새로운 콜백입니다. 아래 GIF에서 볼 수 있듯이.

enter image description here

내가 이것을 달성 할 수있는 모든 아이디어를 어떻게가? 감사합니다.

+0

LayoutManager는 뷰 위치를 처리합니다. ItemAnimator와 연계하여 LinearLayoutManager를 자세히 살펴보십시오 ... RecyclerView를 만든 사람들의 멋진 동영상이 있습니다 https://www.youtube.com/watch?v=LqBlYJTfLP4 –

+0

[예제] (https : // github.com/iPaulPro/Android-ItemTouchHelper-Demo)? – elgringo

+0

@elgringo 예, 드래그 앤 드롭 구현에 대한 지침서입니다. –

답변

0

도움이 될 것입니다.

ItemTouchHelper.Callback에는 ViewHolders 목록에서 놓기보기 아래에있는 놓기 대상을 선택하고보기를 끌 때 여러 번 호출되는 choseDropTarget()이라는 메서드가 있습니다. 여기에는 드래그 된보기가 아래보기를 가리키고있을 때 및 호버링이 중지 될 때를 계산하는 정보가 있습니다.

@Override 
public RecyclerView.ViewHolder chooseDropTarget(RecyclerView.ViewHolder selected, List<RecyclerView.ViewHolder> dropTargets, int curX, int curY) { 
    for (RecyclerView.ViewHolder target : dropTargets) { 
      int top = curY - selected.itemView.getTop(); 
      int bottom = curY + selected.itemView.getHeight(); 
      int diff; 
      if (top < 0) { 
       diff = target.itemView.getTop() - curY; 
      } else { 
       diff = target.itemView.getBottom() - bottom; 
      } 
      if (Math.abs(diff) <= 100) { 
       adapter.onItemHover(); 
      } else { 
       adapter.onItemHoverFinish(); 
      } 
    } 
    return super.chooseDropTarget(selected, dropTargets, curX, curY); 
} 

있어서 드래그 뷰와 밑면과의 차이가 작은 경우보다 100 onItemHover() 콜백이 호출되고, 그렇지 onItemHoverFinished() 간의 오프셋 차이를 계산한다.

이 문제에 대해 좀 더 우아한 방법이 있다면 알려주십시오. 감사!

0

스왑 전에 대화 또는 조건을 넣을 수 있으며 성공하면 위치를 바꿀 수 있습니다.

@Override 
public boolean onItemMove(int fromPosition, int toPosition) { 
    if (fromPosition < toPosition) { 
     for (int i = fromPosition; i < toPosition; i++) { 
      Collections.swap(mItems, i, i + 1); 
     } 
    } else { 
     for (int i = fromPosition; i > toPosition; i--) { 
      Collections.swap(mItems, i, i - 1); 
     } 
    } 
    notifyItemMoved(fromPosition, toPosition); 
    return true; 
} 

나는 아직 테스트 havnt하지만 희망이 내가 여기 거 포스트를 해요 그래서 묻는 질문에 대한 해결책을 발견

+0

불행히도'onItemMove'는 드래그 된 항목이 아래의 항목을 넘어서 드래그 된 후에 만 ​​호출됩니다. 첨부 된 GIF 에서처럼 드래그 한 항목이 아래 항목 바로 위에있을 때 미리보기를 표시해야합니다. 'ItemTouchHelper.Callback'의'onMove'와'onMoved' 콜백 메소드도 같습니다. –

+0

그러나 다른 항목으로 끌고 있습니다. 나는 그것이 효과가있을 것이라고 생각한다. 왜냐하면 폴더에 넣는 동안에도 그 폴더 위에 정확하게 항목을 만들 필요가 없기 때문입니다. 그걸 잠깐 들여 놓으면 좋다. – ABDevelopers