2012-06-20 38 views
5

Tôi đang tìm kiếm một ListPreference trong đó người dùng có thể thay đổi thứ tự các mục từ danh sách. Các mục sẽ có thể kéo và có thể được người dùng sắp xếp lại.Làm thế nào để tạo một ListView với các mục có thể kéo?

Tôi thấy điều này trong ROM tùy chỉnh của mình (và tôi gần như chắc chắn mình đã thấy nó trong CyanogenMod) cho QuickPanel. Dưới đây là một ảnh chụp màn hình để có được những ý tưởng thông qua:

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

tôi biết làm thế nào tôi có thể làm cho các mục tùy chỉnh ListView và thiết lập các biểu tượng cho biết các mặt hàng là có thể kéo, nhưng tôi không biết làm thế nào để làm cho họ có thể kéo và thay đổi thứ tự cho phù hợp. Đối với việc lưu chúng trong các sở thích, tôi tìm thấy this có thể được thực hiện dễ dàng.

PS: Tôi biết CyanogenMod là mã nguồn mở, nhưng tôi không thể tìm ra nguồn cho điều đặc biệt này :(Gần nhất tôi có thể nhận được là this, mà nên ở nơi gần màn hình khác ...

Cảm ơn trước cho bất kỳ đầu về vấn đề này

CẬP NHẬT:. tôi đã kết thúc bằng cách sử dụng các tập tin từ câu trả lời chấp nhận, với bổ sung và sửa đổi tôi liệt kê chúng ở đây để tham khảo thêm

    ..
  • Sử dụng Bộ điều hợp tùy chỉnh (ArrayAdapter trong trường hợp của tôi), để triển khai phản hồi trực quan mà mục này có thể kéo được, đó là một ImageView gần TextView. Đây là tùy chọn.

  • Đặt DragListener và RemoveListener để cập nhật danh sách tương ứng. ListView không tự động làm điều đó. Và nó phụ thuộc vào Adapter bạn đang sử dụng.

  • Có một dòng đã tạo Chế độ xem cho Nhóm xem, nó tạo ra một số lỗi, vì vậy tôi đã xóa bỏ diễn viên mà không gặp bất kỳ vấn đề gì, điều đó là không cần thiết. (trong phương thức onInterceptTouchEvent).

  • Thay đổi mRemoveMode = 1; trong hàm tạo của TouchInterceptor hoặc một trong số: FLING = 0; SLIDE = 1; TRASH = 2;. Tôi nghĩ rằng đối với TRASH, tài nguyên cũng sẽ khả dụng.

Tôi thực sự lấy tệp không phải từ liên kết của câu trả lời nhưng từ tệp CyanogenMod mà tôi đã có, nhưng tôi đoán các tệp này giống nhau.

Đây là các tập tin thực tế trong dự án (tại r12, tại thời điểm viết bài):

Tôi hy vọng nó giúp người khác :)

+0

Không có chức năng tiêu chuẩn cho điều này, vì vậy bạn phải ghi đè lên Chạm và phát hiện sự kiện chạm. Ghi đè của bạn có thể sẽ được kích hoạt bởi sự kiện longClick, nếu không bạn không biết liệu người dùng có muốn kéo một mục hay cuộn danh sách hay không. – Christine

+0

@Christine Tôi không thể sử dụng [OnDragListener] (http://developer.android.com/reference/android/view/View.OnDragListener.html)? – jadkik94

+0

@ jadkik94 Xin chào. Tôi đang cố gắng thực hiện điều tương tự bằng cách sử dụng các tệp này. Nhưng vì nó là một câu hỏi khá cũ, tôi đã tự hỏi nếu có một tốt hơn hay đúng hơn là tôi muốn nói phương pháp thuận tiện hơn để thực hiện một danh sách kéo có thể đến hay không? Tôi không thể tìm thấy bất kỳ mặc dù. Sẽ đánh giá cao bất kỳ con trỏ bạn có thể cung cấp cho .. Cảm ơn. – Anjani

Trả lời

5

Không có tiện ích tích hợp để làm điều này, nhưng bạn có thể muốn xem xét triển khai tùy chỉnh được trình phát nhạc AOSP sử dụng để cho phép sắp xếp lại các bài hát trong danh sách phát.

TouchInterceptor.java

Đó là lớp học được mở rộng ListView và có trách nhiệm xử lý tất cả các MotionEvents và sắp xếp lại các mục của nó, cũng như phát hiện các thao tác vuốt để xóa các mặt hàng. Bạn có thể thấy nó được triển khai trong một hoạt động ở đây trong lớp học TrackBrowserActivity.java.

Nó có ba giao diện bạn cũng nên biết: DragListener, DropListener và RemoveListener. Bạn có thể sử dụng các giao diện này để cung cấp các callback để kích hoạt các sự kiện đó, để bạn có thể cập nhật các thay đổi được thực hiện theo thứ tự danh sách tới SavedPreferences của bạn (vì ListView sẽ không xử lý cho bạn).

Bạn có thể dễ dàng mở rộng hoặc sửa đổi lớp TouchInterceptor để thêm chức năng bổ sung vì các công cụ cấp thấp là tất cả dành cho bạn.

+0

Phải, tôi biết tôi đã thấy một nơi khác, tại sao tôi không nghĩ về điều này? Thật lạ là họ không sử dụng các sự kiện kéo và thả như [trong tài liệu] (http://developer.android.com/guide/topics/ui/drag-drop.html). Dù sao, tôi có thể không bao giờ làm điều này một mình. Cảm ơn, tôi sẽ thử nó và lấy lại cho bạn. – jadkik94

+0

API kéo và thả đã được thêm vào API cấp 11 và việc triển khai này nhắm mục tiêu API cấp 8, vì vậy có thể được viết trước khi API được hoàn thành hoặc có sẵn rộng rãi. – Victor

+0

Đó có thể là nó. Tôi chỉ nhận thấy một cái gì đó, bạn có chắc là lớp TouchInterceptor được sử dụng trong MusicPicker.java? Lớp đó không được nhập/sử dụng ở đó. – jadkik94

Các vấn đề liên quan