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?

romano
fonte

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.

Mark Allison
fonte
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);

Abror Esonaliyev
fonte
curto e limpo!
precisa saber é o seguinte
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.

RichardP
fonte
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);
David Figueroa
fonte
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);
    }

}
Suragch
fonte