Como você obtém o número da página atual de um ViewPager para Android?

84

Quero saber a posição atual da página do ViewPager. Eu crio um adaptador e o defino como ViewPager. Agora eu quero saber o número da página atual ou a posição da visão atual, porque quero iniciar alguns eventos extras nessa página específica.

Eu usei viewPager.setCurrentItem(1);para definir o primeiro item.

Existe um método semelhante para obter a página atual?

sam_k
fonte

Respostas:

180

nos pacotes mais recentes, você também pode usar

vp.getCurrentItem()

ou

vp é o viewPager,

pageListener = new PageListener();
vp.setOnPageChangeListener(pageListener);

você tem que colocar um ouvinte de mudança de página para seu viewPager. Não existe nenhum método no viewPager para obter a página atual.

private int currentPage;

    private static class PageListener extends SimpleOnPageChangeListener{
            public void onPageSelected(int position) {
                Log.i(TAG, "page selected " + position);
                   currentPage = position;
        }
    }
Yashwanth Kumar
fonte
Muito obrigado cara .. funciona .. Você já trabalhou antes no ViewPager?
sam_k
@Necronet não, não deveria. A classe PageListener deve ser uma classe interna, não uma classe aninhada.
dcow
Eu tenho exceção de ponteiro nulo às vezes no início das imagens do pager, para soluções mais confiáveis ​​eu sugiro isso, funciona bem para mim. stackoverflow.com/a/13831450/2296787
MBH
setOnPageChangeListener()está obsoleto, use em seu addOnPageChangeListener()lugar.
ZzZombo
47

Existe um método object_of_ViewPager.getCurrentItem()que retorna a posição da página visualizada atualmente do pager de visualização

Krishna Shrestha
fonte
Na verdade, eu postei esta resposta primeiro @ChuckBoris, mas esta parece ter obtido mais votos e aparentemente um endosso. Estranhas são as maneiras deste site :)
devanshu_kaushik
17

Se você quiser apenas a posição, vp.getCurrentItem()vai dar para você, não há necessidade de aplicar o onPageChangeListener () apenas para esse fim.

devanshu_kaushik
fonte
8

Você descobrirá que setOnPageChangeListener está obsoleto, use addOnPageChangeListener, conforme abaixo:

ViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
       if(position == 1){  // if you want the second page, for example
           //Your code here
       }
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});
Geraldo Neto
fonte
7

Para este problema, o listener Onpagechange é o melhor, mas também terá um pequeno erro que não detectará a hora de início da 0ª posição. Assim que você mudar a página, ela começará a detectar a posição selecionada na página ... Para isso problema encontrei a solução mais fácil

1.Você tem que manter o valor da posição selecionada e então usá-lo ....
2. Caso 1: No início da posição é sempre Zero ....
Caso 2: Suponha que se você definir o item atual significa que você irá definir isso valor para manter a posição
3. Em seguida, faça sua ação com o uso de manter em sua atividade ...

Public int maintain=0;
myViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i2) {
             //Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPageSelected( int i) {
          // here you will get the position of selected page
            maintain = i;


        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });


updateButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Toast.makeText(MyActivity.this, i+"  Is Selected  "+data.size(), Toast.LENGTH_SHORT).show();
            data.set(maintain, "Replaced "+maintain);         
            myViewPager.getAdapter().notifyDataSetChanged();
        }
    });
Naveen Kumar
fonte
1
setOnPageChangeListener está obsoleto. Use addOnPageChangeListener em vez de setOnPageChangeListener.
Selin
6

getCurrentItem(), na verdade não fornece a posição correta para a primeira e a última página. Corrigi-o adicionando este código:

public void CalcPostion() {    
    current = viewPager.getCurrentItem();

    if ((last == current) && (current != 1) && (current != 0)) {
        current = current + 1;
        viewPager.setCurrentItem(current);
    }
    if ((last == 1) && (current == 1)) {
        last = 0;
        current = 0;
    }
    display();
    last = current;
}
Da-monge
fonte
5

Não existe nenhum método getCurrentItem () em viewpager.i já verificado na API

Raman
fonte
3
Você tem que atualizar o pacote de compatibilidade no Android SDK Manager, então apenas você obterá esse método.
krisDrOid
5

O método setOnPageChangeListener () está obsoleto. Use addOnPageChangeListener (OnPageChangeListener) em vez disso.

Você pode usar OnPageChangeListener e obter a posição dentro do onPageSelected()método, este é um exemplo:

   viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            Log.d(TAG, "my position is : " + position); 
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

Ou apenas use getCurrentItem () para obter a posição real:

viewPager.getCurrentItem();
Jorgesys
fonte