8

Tôi đang cố gắng triển khai cử chỉ "vuốt từ trái sang phải để xóa" hiện diện cho thông báo trong Android ICS trở lên. Tôi có một listview trong ứng dụng của tôi. Tôi có máy dò cử chỉ hoạt động. NHƯNG khi tôi vuốt từ trái sang phải trên một mục danh sách cụ thể, tôi muốn mục đó di chuyển cùng với ngón tay của tôi. Khi tôi di chuyển ngón tay của mình, ngoài một điểm nhất định, chỉ khi đó mục đó sẽ tự xóa. Phương thức OnFling() Tôi hiện không đạt được điều này.Android "vuốt từ trái sang phải để xóa", cử chỉ trên mục danh sách, Kiểu ICS

Làm cách nào tôi có thể sửa đổi phương thức OnFling() để làm cho mục di chuyển cùng với ngón tay của tôi?

Gesture lớp thính giả của tôi là

class GestureListener extends SimpleOnGestureListener { 
     private static final int SWIPE_MIN_DISTANCE = 50; 
     private static final int SWIPE_MAX_OFF_PATH = 100; 
     private static final int SWIPE_THRESHOLD_VELOCITY = 25; 

     private MotionEvent mLastOnDownEvent = null; 

     @Override 
     public boolean onDown(MotionEvent e) { 
      mLastOnDownEvent = e; 
      return super.onDown(e); 
     } 

     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      // TODO Auto-generated method stub 
      Toast.makeText(getApplicationContext(), "On Single TAP up ", Toast.LENGTH_SHORT).show(); 
      return super.onSingleTapUp(e); 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float velocityY) { 
      if (e1 == null) { 
       e1 = mLastOnDownEvent; 
      } 
      if (e1 == null || e2 == null) { 
       return false; 
      } 

      float dX = e2.getX() - e1.getX(); 
      float dY = e1.getY() - e2.getY(); 

      if (Math.abs(dY) < SWIPE_MAX_OFF_PATH 
        && Math.abs(velocityX) >= SWIPE_THRESHOLD_VELOCITY 
        && Math.abs(dX) >= SWIPE_MIN_DISTANCE) { 
       if (dX > 0) { 
        int position = tasks.pointToPosition((int) e1.getX(), 
          (int) e1.getY()); 

        int _id = (int) tasks.getItemIdAtPosition(position); 
        databaseConnector.deleteContact(_id); 

        new DeleteRow(_id, contactAdapter, getApplicationContext()); 
       contactAdapter.notifyDataSetChanged(); 


        Toast.makeText(getApplicationContext(), 
          "Right Swipe" + _id, Toast.LENGTH_SHORT).show(); 
       } else { 

        Toast.makeText(getApplicationContext(), "Left Swipe", 
          Toast.LENGTH_SHORT).show(); 
       } 
       return true; 
      } 

      return false; 
     } 
+1

Nếu bạn chưa làm như vậy, bạn có thể muốn peek tại thực hiện Roman Nurik của: https: // plus .google.com/113735310430199015092/posts/Fgo1p5uWZLu hoặc Jake Wharton's backport sử dụng NineOldAndroids: https://github.com/JakeWharton/SwipeToDismissNOA – CommonsWare

Trả lời

5

Bạn nên có một cái nhìn tại swipe Roman Nurik để bỏ đoạn mã ở github nếu bạn muốn thực hiện loại hình này các chức năng. Bạn có thể tìm thấy nó here.

+0

Điều này đã giúp! Cảm ơn – newbie

+0

Tác giả của Swipe-To-Dismiss (Tim Roes) đã xuất bản một phiên bản mới có tên EnhancedListView: https://github.com/timroes/EnhancedListView. Bạn thậm chí có thể tải xuống bản trình diễn từ Cửa hàng Play. – Samoht

+0

Tôi đang sử dụng cùng một mục nhưng listview không trượt trơn tru tôi có nghĩa là nếu người dùng vuốt nhẹ xuống dưới thì thao tác vuốt không được phát hiện. Bất kỳ trợ giúp được đánh giá cao. Cảm ơn trước – Awadesh

2

Nếu bạn có thể sử dụng thư viện hỗ trợ mới hơn, RecyclerView có một số chức năng được tích hợp ở dạng ItemTouchHelper và phương pháp onSwiped có thể cung cấp cho bạn hành vi mong muốn.

rằng sự ủng hộ bắt đầu từ năm v22.2.0 của thư viện hỗ trợ RecyclerView theo câu trả lời rất hữu ích này: https://stackoverflow.com/a/30601554/1518546

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