2012-03-09 36 views
7

Có cách nào để xác định xem listview đang được cuộn lên hoặc xuống không?Làm thế nào để phát hiện xem một listview đang cuộn lên hoặc xuống trong android?

OnScrollListener không giúp tôi trong trường hợp này.

Cảm ơn trước!

+0

chính xác bạn muốn gì? u có thể giải thích thêm ... –

+0

Tôi muốn tạo một số mã khi danh sách đang cuộn lên và tạo mã khác khi danh sách đang cuộn xuống. do đó, tôi muốn phát hiện nếu nó cuộn lên hoặc xuống – dor506

+3

Xem http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview này –

Trả lời

12

đây là một thực hiện đơn giản:

lv.setOnScrollListener(new OnScrollListener() { 
     private int mLastFirstVisibleItem; 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 

      if(mLastFirstVisibleItem<firstVisibleItem) 
      { 
       Log.i("SCROLLING DOWN","TRUE"); 
      } 
      if(mLastFirstVisibleItem>firstVisibleItem) 
      { 
       Log.i("SCROLLING UP","TRUE"); 
      } 
      mLastFirstVisibleItem=firstVisibleItem; 

     } 
    }); 
+2

Chỉ hữu ích khi mục trên cùng không còn là mục đầu tiên nữa.Sẽ không cho bạn biết hướng nếu bạn di chuyển qua lại trong khi cùng một mục vẫn ở trên cùng. – AndroidDev

4

Có một phương pháp trong ScrollViews báo cáo việc dịch chuyển cuộn. Nó được gọi là onScrollChanged(). Tuy nhiên, nó được khai báo bảo vệ, vì vậy bạn phải tạo một lớp trình bao bọc để truy cập. Để sử dụng phương pháp, vui lòng kiểm tra tài liệu android.

Đầu tiên, tạo một giao diện để tiếp xúc với các phương pháp bảo vệ

public interface OnScrollListener { 
void onScrollChanged(int x, int y, int oldx, int oldy); 
} 

Sau đó, tạo wrapper của bạn và mở rộng scrollview

public class ReportingScrollView extends ScrollView { 
private OnScrollListener onScrollListener = null; 

public ReportingScrollView(Context context) { 
    super(context); 
} 

public ReportingScrollView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public ReportingScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public void setOnScrollListener(OnScrollListener onScrollListener) { 
    this.onScrollListener = onScrollListener; 
} 

@Override 
protected void onScrollChanged(int x, int y, int oldx, int oldy) { 
    super.onScrollChanged(x, y, oldx, oldy); 
    if (onScrollListener != null) { 
     onScrollListener.onScrollChanged(x, y, oldx, oldy); 
    } 
} 
} 

Cuối cùng, bao gồm nó trong bố trí XML của bạn giống như một giao diện tùy chỉnh, và đính kèm người nghe như bình thường.

<your.package.ReportingScrollView /> 

scrollingandtrolling.setOnScrollListener(new OnScrollListener() {...}); 
+2

Điều này dường như chỉ được gọi khi bạn thoát khỏi danh sách, nó không liên tục được gọi. –

0

Các giải pháp được đưa ra bởi một số Noob Student là tốt: bạn phải tạo một wrapper để sử dụng onScrollChanged bảo vệ (int x, int y, int oldx , int oldy) phương pháp, được kích hoạt thường xuyên hơn sau đó các tiêu chuẩn AbsListView.OnScrollListener.onScrollStateChanged (AbsListView xem, int scrollState).

Thật không may onScrollChanged() luôn trả về 0 dưới dạng tham số, bất kể tôi di chuyển như thế nào, và dường như chỉ phát hiện khi cuộn kết thúc, đến đầu hoặc cuối danh sách. Vì vậy, tôi đã sử dụng đoạn mã sau để phát hiện đúng hướng di chuyển: nó sử dụng getTop() của mục hiển thị đầu tiên nhưng cũng sử dụng vị trí của nó để hiểu khi nào mục đầu tiên không nhìn thấy được nữa; trong quá trình chuyển đổi mục này, hướng cuộn được đưa ra bởi chính vị trí mục đó.

 @Override 
     public void onScrollChanged(int x, int y, int oldx, int oldy) { 

      if(listView.getChildAt(0) != null) { 
       int scrollingDir = NO_SCROLLING; 
       int firstChildTop = listView.getChildAt(0).getTop(); 

       if (listView.getFirstVisiblePosition() == mLastFirstVisiblePosition) { 
        if (mLastFirstChildTop < firstChildTop) { 
         //Scrolling DOWN 
         scrollingDir = SCROLLING_DOWN; 
        } else if (mLastFirstChildTop > firstChildTop) { 
         //Scrolling UP 
         scrollingDir = SCROLLING_UP; 
        } 
       } else if(listView.getFirstVisiblePosition() > mLastFirstVisiblePosition) { 
        //Scrolling UP 
        scrollingDir = SCROLLING_UP; 
       } else { 
        //Scrolling DOWN 
        scrollingDir = SCROLLING_DOWN; 
       } 
       mLastFirstVisiblePosition = listView.getFirstVisiblePosition(); 
       mLastFirstChildTop = firstChildTop; 

       switch(scrollingDir) { 
        case SCROLLING_DOWN: 
         //Your DOWN scrolling code here 
         break; 

        case SCROLLING_UP: 
         //Your UP scrolling code here 
         break; 

        default: 
        case NO_SCROLLING: 
         break; 
       } 
      } 
     } 
0
list.setOnScrollListener(new OnScrollListener() { 
     int last_item; 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      if(last_item<firstVisibleItem+visibleItemCount-1){ 
       System.out.println("List is scrolling upwards"); 
      } 
      else if(last_item>firstVisibleItem+visibleItemCount-1){ 
       System.out.println("List is scrolling downwards"); 
      } 
      last_item = firstVisibleItem+visibleItemCount-1; 
     } 
    }); 

đây dựa trên các mục có thể nhìn thấy cuối cùng tôi quyết định xem danh sách được đi lên hoặc xuống

1

Một giải pháp dễ dàng và làm việc.

private int lastPosition = -1; 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
     { 
      if(lastPosition == firstVisibleItem) 
      { 
       return; 
      } 

      if(firstVisibleItem > lastPosition) 
      { 
       Logger.print("Going Down"); 
      } 
      else 
      { 
       Logger.print("Going Up"); 
      } 

      lastPosition = firstVisibleItem; 
     } 
+1

hoạt động hoàn hảo, cảm ơn! – error1337

1

cho ai bao giờ vẫn đang tìm kiếm một câu trả lời cho Kotlin, điều này làm việc cho nó

MainListView.setOnScrollListener(object :AbsListView.OnScrollListener { 
    // var VisibleItem: Int = 0 
     override fun onScroll(p0: AbsListView?, FirstVisibleItem: Int, i2: Int, i3: Int) { 
     /* 
     if(VisibleItem < FirstVisibleItem) 
     { 
     Toast.makeText(applicationContext,"Scrolling Down",Toast.LENGTH_SHORT).show() 
      fab.hide() 
     } 
     if(VisibleItem >FirstVisibleItem) 
     { 
      fab.show() 
      Toast.makeText(applicationContext,"Scrolling Up",Toast.LENGTH_SHORT).show() 
     } 
      VisibleItem=FirstVisibleItem; 
    */ 
     } 
     override fun onScrollStateChanged(p0: AbsListView?, p1: Int) { 
      if (p1 == 1) { 
       fab.hide() 
      } else { 
       fab.show() 
      } 
     } 

    }) 
} 

Bỏ ghi chú để sử dụng một phương pháp khác.

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