Como mudar a página do ViewPager?


150

Estou usando o ViewPager no meu aplicativo e defino-o na Atividade principal. onCreateMétodo interno Carrego um número de páginas de SharedPreferences e depois o passo para PagerAdapter:

@Override
public int getCount() {
    return numberOfPages;
}

O problema é que, se eu alterasse esse número nas Preferências (ou em outra Atividade) para outro índice de página menor do que o visto anteriormente, meu aplicativo trava porque esse índice fica fora dos limites ao retornar à atividade com este ViewPager. Pode ser corrigido simplesmente alterando a página do ViewPager ativo. Há alguma forma de fazer isso?

Respostas:


394

Não sei se entendi bem a pergunta, mas, a partir do título, acho que o que você está procurando é pager.setCurrentItem( num ). Isso permite que você alterne programaticamente para outra página dentro do ViewPager.

Eu precisaria ver um rastreamento de pilha do logcat para ser mais específico se esse não for o problema.


3
Sim, é exatamente disso que eu preciso. Defini-o 0no onPausemétodo e não há falhas. Obrigado.
Roman

1
De fato, há muito menos documentação no ViewPager. +1 para isso.
Arnab Chakraborty

1
Se o seu pager tempo take muito para carregar a página que você pode usar setOffscreenPageLimit (1), porque, por padrão vista carga pager +1 e -1 página da posição atual
Ajay Pandya

Isso não funciona, apenas recebo um erro dizendo que o fragmento já foi adicionado.
BlondeSwan

24

deslize para a direita

viewPager.arrowScroll (View.FOCUS_RIGHT);

deslize para a esquerda

viewPager.arrowScroll (View.FOCUS_LEFT);



1
Eu quase acredito que essa deve ser a resposta aceita. É muito mais prático do que definir o item atual.
Peter

18

Sem verificar seu código, acho que o que você está descrevendo é que suas páginas estão fora de sincronia e você tem dados obsoletos.

Você diz que está alterando o número de páginas e travando porque está acessando o antigo conjunto de páginas. Parece-me que você não está ligando pageAdapter.notifyDataSetChanged()depois de alterar seus dados.

Quando você viewPagerestiver exibindo a página 3 de um conjunto de 10 páginas e você mudar para um conjunto com apenas 5 e depois ligar notifyDataSetChanged(), o que você verá é que agora está visualizando a página 3 do novo conjunto. Se você estava visualizando a página 8 do conjunto antigo anteriormente, após colocar o novo conjunto e ligar, notifyDataSetChanged()verá que agora está visualizando a última página do novo conjunto sem travar.

Se você simplesmente mudar sua página atual, pode estar apenas ocultando o problema.


1
mais 1 para notifyDataSetChanged ()
madhu527 5/16

@ Richard Você salva meu amigo do dia. 10000+ paranotifyDataSetChanged()
Ali

15

para mudar para outra página, tente com este código:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);

1
Perfeito! Tentei usá-lo sem o método postDelay e não funcionou. Você sabe por que ele funciona com esse método? Obrigado! :)
Georgi Koemdzhiev

Mesma pergunta ... por que o item está mudando com esse atraso e não o contrário?
Kalyan Raghu

@GeorgiKoemdzhiev Porque a visualização ainda não está concluída quando você está chamandoviewPager.setCurrentItem
Zohab Ali 12/12/18

3

Resposta complementar

Originalmente, estava tendo problemas para obter uma referência ao ViewPagermétodo de outros métodos de classe porque addOnTabSelectedListenercriava uma classe interna anônima, que por sua vez exigia que a ViewPagervariável fosse declarada final. A solução foi usar uma variável de membro da classe e não a classe interna anônima.

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        // don't use an anonymous inner class here
        tabLayout.addOnTabSelectedListener(tabListener);

    }

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    };

    // The view pager can now be accessed here, too.
    public void someMethod() {
        viewPager.setCurrentItem(0);
    }

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.