ViewPager2 là thư viện do Android cung cấp để thực hiện giao diện lướt trang. Đây là phiên bản nâng cấp của ViewPager, được xây dựng dựa trên RecyclerView, mang lại nhiều tính năng mới và hiệu suất tốt hơn. ViewPager2 xử lý chuyển đổi trang hiệu quả hơn, hỗ trợ lướt theo chiều dọc và thường được dùng để hiển thị gallery ảnh, giao diện chính ứng dụng với các tab. Nhờ nền tảng RecyclerView, có thể tận dụng nhiều cấu hình như ItemDecoration, LayoutManager.
Ưu điểm nổi bật
Hiệu suất cao: ViewPager2 sử dụng cơ chế của RecyclerView nên hiệu suất được cải thiện đáng kể, đặc biệt khi xử lý lượng dữ liệu lớn hoặc hiệu ứng chuyển trang phức tạp.
Tính mở rộng linh hoạt: Thiết kế dựa trên RecyclerView giúp dễ dàng tùy chỉnh, sử dụng các tính năng như ItemDecoration, LayoutManager một cách hiệu quả.
Hỗ trợ cập nhật dữ liệu thông minh: ViewPager2 tích hợp DiffUtil để cập nhật chỉ những phần thay đổi, tránh tải lại toàn bộ danh sách.
Hiệu ứng chuyển trang tùy chỉnh: Giao diện PageTransformer cho phép lập trình viên thiết kế hiệu ứng như thu phóng, mờ dần khi lướt.
Trải nghiệm lướt mượt mà: Cung cấp nhiều phương thức kiểm soát cử chỉ như setUserInputEnabled và setIsNestedScrollingEnabled.
Tích hợp liền mạch với TabLayout: Sử dụng TabLayoutMediator để đồng bộ hóa với TabLayout, hỗ trợ thêm/xóa tab động dễ dàng.
Quản lý vòng đời Fragment: Hỗ trợ lazy loading và quản lý vòng đời Fragment qua Lifecycle, tối ưu hiệu năng ứng dụng.
Dễ sử dụng và tích hợp: API đơn giản, dễ hiểu, có thể nhanh chóng tích hợp vào dự án hiện tại.
So sánh với ViewPager, ViewPager2 có nhiều cải tiến rõ rệt về hiệu suất, tính mở rộng, trải nghiệm người dùng và khả năng tích hợp.
Khác biệt chính với ViewPager
Cơ chế nội bộ: ViewPager2 dùng RecyclerView, trong khi ViewPager tự triển khai cơ chế lướt.
Hướng lướt: ViewPager2 hỗ trợ cả ngang và dọc, còn ViewPager chỉ ngang.
Adapter: ViewPager2 dùng Adapter kế thừa từ RecyclerView.Adapter, ViewPager dùng 2 loại FragmentStatePagerAdapter và FragmentPagerAdapter.
Quản lý vòng đời: ViewPager2 tự động quản lý vòng đời Fragment, ViewPager cần xử lý thủ công.
Tích hợp TabLayout: ViewPager dùng setupWithViewPager(), ViewPager2 dùng TabLayoutMediator.
Ví dụ minh họa:
Thêm phụ thuộc:
dependencies {
implementation "androidx.viewpager2:viewpager2:1.0.0"
}
Giao diện XML:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Mã nguồn:
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.viewpager2.widget.ViewPager2
import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter
class MainActivity : AppCompatActivity() {
private lateinit var viewPager: ViewPager2
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewPager = findViewById(R.id.viewPager)
// Khởi tạo adapter
val adapter = CustomPagerAdapter(lifecycle)
// Gắn adapter vào ViewPager
viewPager.adapter = adapter
}
}
// Adapter tùy chỉnh
class CustomPagerAdapter(private val lifecycle: Lifecycle) : FragmentStateAdapter(lifecycle) {
private val titles = listOf("Trang 1", "Trang 2", "Trang 3")
override fun getItemCount() = titles.size
override fun createFragment(position: Int): Fragment {
return PageContentFragment().apply {
arguments = Bundle().apply {
putString("title", titles[position])
}
}
}
}
// Fragment hiển thị nội dung
class PageContentFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.page_content_layout, container, false)
val title = arguments?.getString("title")
title?.let {
view.findViewById<TextView>(R.id.contentText).text = it
}
return view
}
}
Trong ví dụ này, lớp CustomPagerAdapter kế thừa FragmentStateAdapter để quản lý danh sách Fragment. Mỗi Fragment (PageContentFragment) hiển thị tiêu đề tương ứng được truyền qua Bundle. ViewPager được khởi tạo và gắn adapter trong Activity.