Zmiana numeru ListView
na RecyclerView
sprawi, że będzie o wiele łatwiej.
można znaleźć cały artykuł na Styling Android i cały kod here.
Ten kod wykorzystuje OnItemTouchListener
wykryć, kiedy przedmiot powinien być przeciągnięty. Istnieje ImageView
powyżej RecyclerView
z obrazem przenoszonego przedmiotu, który można tanio ożywiać.
OnItemTouckListener
(DragController.java
):
public class DragController implements RecyclerView.OnItemTouchListener {
private RecyclerView recyclerView;
private ImageView overlay;
private final GestureDetectorCompat gestureDetector;
private boolean isDragging = false;
public DragController(RecyclerView recyclerView, ImageView overlay) {
this.recyclerView = recyclerView;
this.overlay = overlay;
GestureDetector.SimpleOnGestureListener longClickGestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
isDragging = true;
dragStart(e.getX(), e.getY());
}
};
this.gestureDetector = new GestureDetectorCompat(recyclerView.getContext(), longClickGestureListener);
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
if (isDragging) {
return true;
}
gestureDetector.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
int x = (int) e.getX();
int y = (int) e.getY();
View view = recyclerView.findChildViewUnder(x, y);
if (e.getAction() == MotionEvent.ACTION_UP) {
dragEnd(view);
isDragging = false;
} else {
drag(y, view);
}
}
Rozpoczęcie i zakończenie przeciągania (DragController.java
):
private boolean isFirst = true;
private static final int ANIMATION_DURATION = 100;
private int draggingItem = -1;
private float startY = 0f;
private Rect startBounds = null;
private void dragStart(float x, float y) {
View draggingView = recyclerView.findChildViewUnder(x, y);
View first = recyclerView.getChildAt(0);
isFirst = draggingView == first;
startY = (y - draggingView.getTop());
paintViewToOverlay(draggingView);
overlay.setTranslationY(y - startY);
draggingView.setVisibility(View.INVISIBLE);
draggingItem = recyclerView.indexOfChild(draggingView);
startBounds = new Rect(draggingView.getLeft(), draggingView.getTop(), draggingView.getRight(), draggingView.getBottom());
}
private void drag(int y, View view) {
overlay.setTranslationY(y - startY);
}
private void dragEnd(View view) {
overlay.setImageBitmap(null);
view.setVisibility(View.VISIBLE);
view.setTranslationY(overlay.getTranslationY() - view.getTop());
view.animate().translationY(0f).setDuration(ANIMATION_DURATION).start();
}
private void paintViewToOverlay(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
overlay.setImageBitmap(bitmap);
overlay.setTop(0);
}
Kod jest napisany przez Mark Allison on StylingAndroid.
Edit:
Ale nie wiem, jak zdobyć pozycję elementu podczas przeciągania jest koniec
Odpowiedź znajduje się w part 7 na Styling Androida.
View view = recyclerView.findChildViewUnder(0, y);
i jak mogę wyłączyć przeciągnij folder i nagłówka sprzęcie? Po prostu pozwól przeciągnąć element pliku?
Możesz to zrobić, używając wielu ViewTypes (nagłówek pliku, folderu &). Następnie możesz użyć getItemViewType w DragController
, aby rozpocząć ruch tylko dla plików.
Jakąkolwiek możliwość użycia 'RecyclerView' z' ItemTouchHelper' z biblioteki pomocy technicznej? –
Jeśli zmienię na "RecyclerView", czy łatwiej jest to zrobić? – R4j
To powinno być. Nie użyłem go, ale 'ItemTouchHelper' służy do dodawania przeciągania i upuszczania i przesuwania, aby odrzucić wsparcie dla' RecyclerView'. Zapoznaj się z dokumentami "ItemTouchHelper", zobacz, czy możesz znaleźć przykład online. Nie mogę zrozumieć, dlaczego twoje pytanie nie przyciąga więcej uwagi, istnieje wiele bibliotek, które mogą robić tego typu rzeczy. –