
Não passou muito tempo desde 7 de fevereiro de 2019, o Google lançou a versão alfa do Android ViewPager2 . Mais informações sobre esta versão podem ser encontradas aqui . Agora vamos ver o que é o ViewPager2.
Novos recursos
- Layout de suporte da direita para a esquerda,
- Suporte orientação vertical,
PageChangeListener
aprimorado.
O que mudou?
O ViewPager2 foi lançado para o Android X, portanto, se você quiser usá-lo, seu projeto deve usar o Android X. Vamos ver como podemos usar esse novo ViewPager2.
Adicionar dependência
Inclua a seguinte dependência no arquivo build.gradle
nível do aplicativo:
dependencies { implementation "androidx.viewpager2:viewpager2:1.0.0-alpha01" }
Depois disso, sincronize seu projeto.
Personalização
Adicione o widget ViewPager2
à sua atividade ou fragmento:
<androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager2" android:layout_width="match_parent" android:layout_height="match_parent"/>
Vamos criar um layout para a página que será exibida no ViewPager2:
item_page.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.appcompat.widget.AppCompatTextView android:id="@+id/tvTitle" android:textColor="@android:color/white" android:layout_width="wrap_content" android:layout_centerInParent="true" tools:text= "item" android:textSize="32sp" android:layout_height="wrap_content" /> </RelativeLayout>
Em seguida, precisamos criar um adaptador para o ViewPager2. Este é o mais interessante. Para isso, podemos usar RecyclerView.Adapter
. Isso não é legal?
ViewPagerAdapter.kt
class ViewPagerAdapter : RecyclerView.Adapter<PagerVH>() { private val colors = intArrayOf( android.R.color.black, android.R.color.holo_red_light, android.R.color.holo_blue_dark, android.R.color.holo_purple ) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerVH = PagerVH(LayoutInflater.from(parent.context).inflate(R.layout.item_page, parent, false)) override fun getItemCount(): Int = colors.size override fun onBindViewHolder(holder: PagerVH, position: Int) = holder.itemView.run { tvTitle.text = "item $position" container.setBackgroundResource(colors[position]) } } class PagerVH(itemView: View) : RecyclerView.ViewHolder(itemView)
Esse é o mesmo adaptador que usamos para um RecyclerView comum e funciona da mesma forma que no ViewPager2.
Última etapa, instale o adaptador para o ViewPager2:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewPager2.adapter = ViewPagerAdapter() } }
Isso é tudo! Obtemos o mesmo resultado de quando usamos o antigo ViewPager com o PagerAdapter:

Rolagem vertical
Antes, era necessário usar bibliotecas de terceiros para implementar a rolagem vertical, porque até o momento, o Google não ofereceu essa oportunidade imediatamente. Este novo ViewPager2 agora tem suporte para rolagem vertical. Basta alterar a orientação no ViewPager2 e a rolagem vertical será ativada. Muito fácil!
viewPager2.orientation = ViewPager2.ORIENTATION_VERTICAL
Aqui está o resultado:

Usando FragmentStateAdapter
Você também pode usar fragmentos como páginas, como no antigo ViewPager. Existe um FragmentStateAdapter para isso. Vamos ver como podemos usá-lo.
Primeiro de tudo, precisamos criar um fragmento:
class PagerFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.item_page, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { arguments?.let { container.setBackgroundResource(it.getInt("color")) tvTitle.text = "Item ${it.getInt("position")}" } } }
Agora vamos criar um adaptador para o ViewPager2. Passaremos o FragmentManager para seu construtor, que gerenciará os fragmentos:
class ViewPagerFragmentStateAdapter(fm: FragmentManager) : FragmentStateAdapter(fm) { private val colors = intArrayOf( android.R.color.black, android.R.color.holo_red_light, android.R.color.holo_blue_dark, android.R.color.holo_purple ) override fun getItem(position: Int): Fragment = PagerFragment().apply { arguments = bundleOf( "color" to colors[position], "position" to position ) } override fun getItemCount(): Int = colors.size }
Agora instale este novo adaptador no ViewPager2 e pronto:
viewPager2.adapter = ViewPagerFragmentStateAdapter(supportFragmentManager)
OnPageChangeCallback aprimorado
No antigo ViewPager, a interface OnPageChangeListner foi projetada para receber eventos de alteração / rolagem de página. E foi muito inconveniente, porque precisamos substituir os três métodos ( onPageScrollStateChanged
, onPageScrolled
, onPageSelected
), mesmo que não onPageSelected
.
oldViewPager.addOnPageChangeListener(object:ViewPager.OnPageChangeListener{ override fun onPageScrollStateChanged(state: Int) {
Agora temos o OnPageChangeCallback
, uma classe abstrata com métodos não abstratos. O que significa literalmente que não precisamos redefinir todos esses métodos, podemos simplesmente redefinir aqueles que precisamos ou que queremos usar. Assim, por exemplo, podemos rastrear eventos de alteração de página:
viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { super.onPageSelected(position)
Atenção!
Como o ViewPager2 está na versão alfa, existem algumas funções do antigo ViewPager que ainda não foram implementadas ou que não funcionam corretamente nesta versão.
Problemas conhecidos de acordo com a documentação:
- ClipToPadding,
- Nenhuma integração com o TabLayout,
- Não há controle fora da tela,
- Não é possível definir a largura da página (100% por padrão)
Mais informações sobre problemas conhecidos estão aqui . Espero que tudo isso seja corrigido nas próximas atualizações. Estou ansioso por uma versão estável deste novo ViewPager2. Até então, um bom código para todos!