2012-06-20 25 views
5

Szukałem ListPreference, w którym użytkownik może zmienić kolejność pozycji z listy. Elementy mogą być przeciągane i mogą być ponownie zamawiane przez użytkownika.Jak utworzyć listę z przeciągalnymi elementami?

Widziałem to w moim niestandardowym ROM (i jestem prawie pewien, że widziałem to w Cyanogenmod) dla QuickPanel. Oto zrzut ekranu, aby uzyskać ten pomysł przez:

Screenshot of the "widget Button Order" in QuickPanel Settings of Sabotage ROM

wiem, jak mogę uczynić przedmiotów niestandardowych ListView i ustawić ikonę, aby wskazać, że rzeczy są przeciągane, ale nie wiem jak je przeciągać i odpowiednio zmienić kolejność. Jeśli chodzi o zapisywanie ich w preferencjach, znalazłem this, które można łatwo wdrożyć.

PS: Wiem CyanogenMod jest open-source, ale nie mogłem znaleźć źródła dla tej konkretnej rzeczy :(Najbliżej mogę dostać było this, która powinna być gdzieś w pobliżu innego ekranu ...

Dzięki z góry za wszelkie wskazówka o tym

UPDATE. Skończyło się przy użyciu plików z przyjętym odpowiedź, z dodatkami i modyfikacjami jestem wymieniając je tutaj dla dalszego odniesienia

    ..
  • Użyj niestandardowego adaptera (ArrayAdapter w moim przypadku), aby zaimplementować wizualną informację zwrotną, że ten element jest przeciągalny, co jest obrazem w pobliżu widoku TextView. Jest to opcjonalne.

  • Ustaw DragListener i RemoveListener, aby odpowiednio zaktualizować listę. ListView nie robi tego automatycznie. Zależy to od używanego adaptera.

  • Była linia, która rzuciła widok na grupę ViewGroup, popełniła kilka błędów, więc usunąłem obsadę bez żadnego problemu, nie było potrzebne. (w metodzie onInterceptTouchEvent).

  • Zmiana mRemoveMode = 1; w konstruktorze TouchInterceptor lub jednym z: FLING = 0; SLIDE = 1; TRASH = 2;. Myślę, że dla TRASH, zasób powinien być również dostępny.

Tak naprawdę wziąłem plik nie z linku odpowiedzi, ale z pliku Cyanogenmod, który już miałem, ale domyślam się, że te pliki były takie same.

Są to rzeczywiste pliki w projekcie (w R12, w momencie pisania tego tekstu):

Mam nadzieję, że pomaga kogoś innego :)

+0

Nie ma w tym żadnej standardowej funkcji, więc konieczne jest obejście funkcji Touch i wykrycie zdarzenia dotykowego. Twoje przesłonięcie prawdopodobnie zostanie aktywowane przez zdarzenie longClick, w przeciwnym razie nie będziesz wiedział, czy użytkownik chce przeciągnąć element, czy przewinąć listę. – Christine

+0

@Christine Nie mogę użyć [OnDragListener] (http://developer.android.com/reference/android/view/View.OnDragListener.html)? – jadkik94

+0

@ jadkik94 Hi. Próbuję zaimplementować to samo przy użyciu tych plików. Ale ponieważ jest to dość stare pytanie, zastanawiałem się, czy jest coś lepszego, czy raczej powiedziałbym, że wygodniejsza metoda implementacji listy, którą można przeciągnąć pojawiła się czy nie? Nie mogłem jednak znaleźć. Doceniam wszelkie wskazówki, które możesz dać .. Dzięki. – Anjani

Odpowiedz

5

Nie ma wbudowanego widgetu do zrobienia to, ale możesz chcieć rzucić okiem na niestandardową implementację używaną przez odtwarzacz muzyki AOSP, aby umożliwić ponowne zamawianie utworów na listach odtwarzania.

TouchInterceptor.java

To jest klasa, która rozszerza ListView i jest odpowiedzialny za obsługę wszystkich MotionEvents i ponownie nakazująca jej elementów, a także wykrywanie swipes usuwania przedmiotów. Możesz go zaimplementować w działaniu tutaj w klasie TrackBrowserActivity.java.

Posiada trzy interfejsy, o których należy pamiętać: DragListener, DropListener i RemoveListener. Możesz użyć tych interfejsów, aby wywoływać wywołania zwrotne dla tych zdarzeń, aby można było aktualizować zmiany wprowadzone do porządku listy do swoich SavedPreferences (ponieważ ListView tego nie zrobi).

Możesz w łatwy sposób rozszerzyć lub zmodyfikować klasę TouchInterceptor, aby dodać dodatkowe funkcje, ponieważ wszystko na niskim poziomie jest dla Ciebie.

+0

W porządku, wiedziałem, że widziałem to gdzie indziej, dlaczego o tym nie pomyślałem? To dziwne, że nie używają zdarzeń przeciągania i upuszczania, takich jak [w dokumentach] (http://developer.android.com/guide/topics/ui/drag-drop.html). W każdym razie, nigdy bym tego nie zrobił sam. Dzięki, spróbuję i skontaktuję się z Tobą. – jadkik94

+0

Interfejs API "przeciągnij i upuść" został dodany na poziomie interfejsu API 11, a ta implementacja jest kierowana na poziom 8 interfejsu API, więc prawdopodobnie została napisana przed ukończeniem lub powszechnym udostępnieniem interfejsu API. – Victor

+0

To może być to. Właśnie zauważyłem coś, jesteś pewien, że klasa TouchInterceptor jest używana w MusicPicker.java? Ta klasa nie jest importowana/tam używana. – jadkik94

Powiązane problemy