2015-12-20 24 views
5

Mam listę widok z różnych typów elementów: nagłówka, folderów i plików, takich jak ten:Przeciągnij element kropla Listview do innego elementu

enter image description here

teraz „I chciałbym wdrożyć element pliku przeciągnij i upuść do pozycji folderu i uzyskać pozycję źródłową i docelową. Nie chcę zmieniać pozycji docelowej (przearanżować) podczas przeciągania jak niektóre biblioteki widoku listy sortowania przeciągania.

Czy są jakieś sugestie na początek?

+0

Jakąkolwiek możliwość użycia 'RecyclerView' z' ItemTouchHelper' z biblioteki pomocy technicznej? –

+0

Jeśli zmienię na "RecyclerView", czy łatwiej jest to zrobić? – R4j

+0

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. –

Odpowiedz

1

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.

+0

Dzięki. Próbowałem tego. Ale nie wiem, jak uzyskać pozycję przedmiotu po zakończeniu przeciągania. I jak mogę wyłączyć przeciąganie elementów 'Folder' i' Header'? Po prostu pozwól przeciągnąć element 'File'? – R4j

+0

@ R4j zredagowałem moją odpowiedź – LordRaydenMK

+0

To działa. Jesteś moim bohaterem, człowieku. Dziękuję bardzo! – R4j