[android] ViewPager의 현재 위치 가져 오기

갤러리 위젯으로 getSelectedItemPosition (); 현재 위치를 검색하기 위해 ViewPager가 가지고 있지 않은 것 같습니다.

리스너를 설정하고 페이지가 전환 될 때 위치를 검색 할 수 있다는 것을 알고 있습니다. 하지만 현재 뷰 위치를 원합니다.



답변

리스너를 만들고 뷰 페이지에서 설정합니다.

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}


답변

당신이 사용할 수있는:

mViewPager.getCurrentItem()


답변

2019 업데이트

이제 addOnPageChangeListenerView Pager에서 페이지 위치의 변화를 관찰하도록 설정할 수 있습니다 .

리스너를 설정하고 페이지가 전환 될 때 위치를 검색하기를 원했기 때문에

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })


답변

나는 이제 해킹이라고 말하고 있으므로 그 이유에 대해 투표 할 이유가 없습니다. 의미, 그것은 당신에게 구체적으로 도움이되거나 도움이되지 않을 것입니다. 어느 쪽이든 아래 설명은 약간의 통찰력을 제공하고 커뮤니티에 도움이 될 것입니다. 또한이 솔루션은 ViewPager.getCurrentItem().


첫째, 약간의 정보입니다. 만약 당신이 반복 처리와 ViewPager의 모든 자식을 통해 ViewPager.getChildAt(x);과 함께 출력 toString()(또는 getLeft()) 각 아이 뷰 (페이지) 다음 페이지를 변경하려면이 매번 할, 당신은 아이들이 표시되는 논리적 인 순서로 수 없음을 알 수 있습니다 페이지 뒤로 이동을 시작할 때 (처음으로 다시 페이징). 분명히 배열에서 불필요한 자식을 제거한 다음 최신 자식을 배열에 추가합니다. 따라서 예를 들어, 당신은 다음 3 페이지로 변경 2 페이지에서 찾고있다 말할 수, 자녀의 목록이 순서에있을 것입니다 page 2, page 3, page 4그 의미 ViewPager.getChildAt(1);현재 페이지를 반환합니다. 그러나 2 페이지 (3 페이지에서)로 다시 변경하면 자녀 목록이이 순서대로 page 2, page 3, page 1표시됩니다.ViewPager.getChildAt(1);현재 페이지를 반환하지 않습니다. 이 정보를 사용하여 현재 페이지를 제거하는 간단한 논리를 아직 찾지 못했습니다. 뒤에있는 배열의 페이지 getChildAt순서는 사용자가 페이지를 탐색하는 방식에 따라 임의의 순서로되어 있기 때문입니다.

즉, 해킹 해결 방법을 개발했습니다. 이 기능이 모든 환경에서 작동할지 여부는 알 수 없지만 현재 프로젝트에서는 작동합니다. 그렇지 않다면 다른 API 수준의 문제라고 생각합니다. 그러나 실제로 다른 환경에 대한 문제는 의심하지 않습니다.

자, 고기에. 내가 알아 차린 것은 결과가 ViewPager.getChildAt(x).getLeft()부모와 관련된 수평 픽셀 좌표 유형을 가질 것이라는 것입니다. 그래서 저는이 정보를 사용하여 현재 어떤 관점이 있는지 파악했습니다.

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

이 기능은 getLeft()모든 것을 파악하기 위해 의 가치에 의존하기 때문에 의심스러운 해킹 일 것입니다 . 하지만 저는 각 어린이의 왼쪽 좌표를 잡습니다. 그런 다음 이것을 다른 값과 비교하고 첫 번째 및 두 번째 페이지를 저장하여 함수에서 두 번째 페이지 (현재 페이지)를 반환합니다. 아름답게 작동하는 것 같습니다.

왜 (물어봐도 onClickListenter될까요) 내가 그냥 사용 하거나 어떤 해결책을 사용하지 않았 습니까? 글쎄, 나는 청취자, 다른 수업, 결정적이지 않은 초점 및 기타 부풀림을 포함하지 않고도 이것을 할 수있는 직접적인 방법이 있다는 것을 감히 결정했습니다. 안타깝게도이 솔루션은 정확하지 않습니다. 그러나 부풀음, 다른 클래스 및 청취자를 제거합니다. 좀 더 간단한 방법을 알아낼 수 있다면이 함수를 다시 작성하겠습니다. 아니면 다른 사람이 깨달음을 얻을 수있는 통찰력을 제공 할 수도 있습니다.


답변