2009-11-20 18 views
26

Tôi đang cố gắng làm điều gì đó sau khi cuộn dừng. Do đó, tôi đã thử sử dụng OnScrollListener#onScrollStateChanged(SCROLL_STATE_IDLE) để phát hiện khi cuộn đã dừng (hoặc TOUCH_SCROLL or FLING) (ở mức 1.5 nó chạy như tôi mong đợi). Nhưng khi nó chạy trên 2.0, onScrollStateChanged không thể nhận được sự kiện sau khi phát hành finger.Is có bất kỳ callback hoặc anyway để phát hiện sự kiện đó?làm thế nào để phát hiện Android ListView Scrolling dừng lại?

+0

Câu trả lời dưới đây có thể chấp nhận được cho bạn không? Nếu vậy, hãy chấp nhận, nếu không tôi sẽ mong chờ một số phản hồi về câu trả lời ;-) –

Trả lời

65

Hãy thử sử dụng setOnScrollListener và thực hiện các onScrollStateChanged với scrollState == 0 ... làm những gì bạn cần làm ...

setOnScrollListener(new OnScrollListener() { 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
      Log.i("a", "scrolling stopped..."); 
     } 
    } 
}); 
+23

thay vì hardcode bằng 0, sử dụng OnScrollListener.SCROLL_STATE_IDLE Điều này sẽ hoạt động nếu bạn đang cố gắng phát hiện khi cuộn dừng lại ... nếu bạn đang cố gắng để phát hiện khi ngón tay/fling không chạm vào màn hình nữa, đó sẽ là một cách tiếp cận khác .. –

+0

Tôi vừa kiểm tra mã trên với 2.0 và nó hoạt động tốt ... –

7

Bí quyết là để theo dõi khi người dùng được flinging và khi họ không phải. Có vẻ như đây là sự khác biệt duy nhất bạn có thể thực hiện bởi vì, như bạn đã nói, quá trình chuyển từ cuộn bằng ngón tay sang chế độ chờ không được ghi là không phải là. Đây là những gì tôi đang nói về:

public void onScrollStateChanged(AbsListView view, int scrollState) {  
    if (scrollState != OnScrollListener.SCROLL_STATE_FLING) { 
     flinging = false; 
     int count = view.getChildCount(); 

     for (int i = 0; i < count; i++) { 
      View convertView = view.getChildAt(i); 
      Recipe recipe = (Recipe) convertView.getTag(); 
      ImageView image = (ImageView) convertView.findViewById(R.id.icon); 

      if (recipe != null && recipe.getImageURL() != null) { 
       ImageLoader.loadImage(this, image, recipe.getImageURL()); 
      } 
     } 
    } else { 
     flinging = true; 
    } 
} 

Và sau đó trong bộ chuyển đổi ListView:

public View getView(int position, View convertView, ViewGroup parent) { 
    // Bunch of code.... 

    if (!flinging) { 
     ImageLoader.loadImage(BrowseRecipes.this, image, recipe.getImageURL()); 
    } 
} 

Vì vậy, thay vì phản ứng với sự thay đổi trong người nghe, chỉ cần tải các hình ảnh (hoặc bất cứ điều gì bạn cần để làm điều đó một cách chuyên sâu) ngay từ đầu miễn là không có sự xáo trộn nào xảy ra.

Đây là tất cả được đưa ra khỏi dự án của tôi tại đây: https://github.com/pkulak/mealfire_android

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