2012-10-04 5 views
29

목록보기가 특정 고정 된 임계 값을 넘어서서 픽셀로 스크롤되는 것을 감지하려고합니다 (첫 번째 항목의 절반 정도). 불행히도 listview의 getScrollY()는 항상 스크롤 위치의 instad를 0으로 반환하는 것으로 보입니다. 픽셀 단위로 실제 스크롤 위치를 가져 오는 방법이 있습니까?안드로이드 ListView 현재 스크롤 위치 Y 픽셀

여기 내가 사용하려고 코드입니다하지만 말했듯이 그것은 단지 당신이 OnTouchListener을 구현하려고하고 onTouch(View v, MotionEvent event)을 무시하고 event.getX()event.getY()를 사용하여 x와 y를 얻을 수 0

getListView().setOnScrollListener(new AbsListView.OnScrollListener() { 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     Log.d("scroll", "scroll: " + getListView().getScrollY()); 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == 0) 
     Log.d("scroll", "scrolling stopped"); 
    } 
}); 
+0

올바른 [용액 (http://stackoverflow.com/questions/12727594/android-listview-current-scroll-location- y-pixels/35594825 # 35594825) – Sarasranglt

답변

49

단순히 콘텐츠의 전체 높이를 알 수 없기 때문에 Android의 ListView에 대한 Y 스크롤이라는 개념이 없습니다. 표시된 내용의 높이 만 알 수 있습니다. Malachiasz의 대답의

getListView().getChildAt(0).getTop(); 
+1

아마도이 솔루션을 의미 할 것입니다. http://stackoverflow.com/a/3035521/1276636 – Sufian

+0

그건 정말 좋은 힌트입니다. Thy @Cyril Mottier :) – JakeP

+7

더 이상 작동하지 않습니다. 그 코드에 첫 번째 보이는 뷰의 모든 이전 항목의 높이를 추가해야합니다. 일부 내부 api 물건이 최근에 변경되었습니다. api가 어떤 점에서이 값을 얻는 간단한 함수를 포함하기를 바랍니다. 거기에있는 모든 솔루션은 hackish하고 있으며 향후 API 버전으로 중단 될 것입니다. 하나는 listview의 자식 뷰를 혼동해서는 안됩니다. –

0

를 반환합니다. 방금 ListView에서 특정 항목을 삭제하기위한 삭제 버튼을 사용할 수 있도록 ListView 행에 대한 스 와이프 데모를 만들었습니다. 내 github의 소스 코드를 ListItemSwipe으로 확인할 수 있습니다.

+4

'ListView'가 'MotionEvent'속도에 따라 스크롤되므로 y 축에 대한 옵션이 아닙니다. –

0

리팩토링 코드 : 것이 가능하지만

현재 위치/다음과 같은 해킹을 사용하여 눈에 보이는 항목의 Y 스크롤을 얻을 수 있습니다. 이 함수는 동적 행의 높이에 사용됩니다.

통화 onScroll 리스너

mListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 

      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if (mCardsListView.getChildCount() > 0) { 
        int scrollY = getScrollY(); 
       } 
      } 
     }); 

getScrollY 기능

private Dictionary<Integer, Integer> mListViewItemHeights = new Hashtable<Integer, Integer>(); 
private int getScrollY() { 
     View child = mCardsListView.getChildAt(0); //this is the first visible row 
     if (child == null) return 0; 

     int scrollY = -child.getTop(); 

     mListViewItemHeights.put(mCardsListView.getFirstVisiblePosition(), child.getHeight()); 

     for (int i = 0; i < mCardsListView.getFirstVisiblePosition(); ++i) { 
      Integer hei = mListViewItemHeights.get(i); 

      //Manual add hei each row into scrollY 
      if (hei != null) 
       scrollY += hei; 
     } 

     return scrollY; 
    }