Como trabalhar com o ViewPager2

Como trabalhar com o ViewPager2


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:


Horizontal ViewPager2


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:


Vertical ViewPager2


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) { //   } override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { //   } override fun onPageSelected(position: 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!

Source: https://habr.com/ru/post/pt447406/


All Articles