Search This Blog

Saturday, June 24, 2017

ViewPager trong Android

ViewPager nằm trong bộ thư viện android.support.v4.view.ViewPager. Ta thường gặp ViewPager trên rất nhiều ứng dụng và thường thao tác với ViewPager bằng cách trượt qua trái, trượt qua phải để chuyển giữa các layout. Và cụ thể thì ta thường gặp ViewPager trên ứng dụng Thư viện ảnh,danh bạ. v.v.v. “Hướng dẫn ViewPager trong Android” sẽ gồm 3 phần dựa trên 3 cách xây dựng adapter.

Overview

ViewPager thường được sử dụng với Fragment.Android ViewPager cung cấp cho ta 3 cách để xây dựng adapter tùy vào từng trường hợp mà ta nên chọn cách phù hợp nhất :
1. extend FragmentPagerAdapterKhi chúng ta có số lượng ít các fragment và có thể là các fragment tĩnh. Vì mỗi fragment khi hiển thị sẽ được lưu data trong bộ nhớ cache. Khi ta đã chuyển qua các fragment khác thì FragmentPagerAdapter sẽ gọi hàm detach Fragment này vào 1 transaction, thay vì gọi hàm remove fragment có nghĩa là những fragment instances vẫn tồn tại trong FragmentManager, có thể làm đầy bộ nhớ, ảnh hưởng đến hiệu suất của ứng dụng nếu chúng ta sử dụng nhiều Fragment trong ViewPager.
2. extend FragmentStatePagerAdapterKhi ta phải sử dụng nhiều fragment độngFragmentStatePagerAdapter có thể lưu data trong savedInstanceState và destroyView khi mà fragment không còn hiển thị. Khi người dùng back lại với fragment đó dữ liệu sẽ restore từ BundleFragment. Cũng vì vậy mà nó không ảnh hưởng đến quá hiệu suât của ứng dụng khi mà chúng ta có 1 số lượng lớn các Fragment.
Tóm lại sự khác biệt của FragmentPagerAdapter và FragmentStatePagerAdapter ở  cách xử lý dữ liệu khi mà ta chuyển đổi giữa các fragment
FragmentPagerAdapter : thì trong hàm destroyItem() nó chỉ gọi hàm detach() :
FragmentStatePagerAdapter: trong hàm destroyItem() nó sẽ gọi hàm remove() sau khi gọi hàm mSaveState() 
3. extend PagerAdapter: Khi mà ta chỉ cần sử dụng Views thuần đơn giản thay vì sử dụng fragments phức tạp. VD: Trong ứng dụng gallary ta chỉ cần trượt qua trái hoặc qua phải  để chuyển qua lại các hình ảnh, với cấu trúc đó ta nên sử extend PagerAdapter.

Chúng ta sẽ bắt đầu với PagerAdpater


1. Layout

Đầu tiên ta cần layout: activity_main.xml để chứa
Tiếp theo là 1 layout item để chứa item của ViewPager:

2. MainActivity.java

Trong hàm OnCreate() chúng ta cần khai báo 1 đối tượng ViewPager và trỏ nó tới @+id/viewpager
Trong ứng dụng này chúng ta sẽ cần 1 danh sách hình ảnh từ trong Resource Drawable để load lên ViewPager (Chú ý : chúng ta chỉ trọn được hình ảnh có độ phân giải nhỏ hơn 720*1200 nếu không bạn sẽ bị lỗi OutOfMemory).
Và giờ chúng ta  cần phải khởi tạo đối tượng ViewPagerAdapter và truyền vào danh sách Images và Activity cha. Dưới đây là code tất cả trong class MainActivity.

3. ViewPagerAdapter.java

Trong MainActivity hàm OnCreate() chúng ta mới khởi tạo 1 ViewPagerAdapter với mImageResources là danh sách hình ảnh vậy chúng ta sẽ làm gì với danh sách hình ảnh này ?
Cũng giống như các Adapter khác công việc của Adapter sẽ là làm sao để nó duyệt qua từng phần tử của mảng dữ liệu để hiển thị nó lên View. Vậy chúng ta sẽ viết và custorm  nó như sau :
Ok. Ở đây bạn sẽ thấy chúng ta đang extend từ Class PagerAdapter. Vậy thì chúng ta sẽ phải @Overide  lại các phương thức sau :
- instantiateItem(ViewGroup, int)
- destroyItem(ViewGroup, int, Object)
- getCount()
- isViewFromObject(View, Object)
instantiateItem : là method tạo page ở những cho từng position nhất định và tái sử dụng page theo từng key (position) của mảng data mResources[].  Nó tương tự các method getView hay bindViewHolder trong ListViewAdapter hoặc RecyclerViewAdapter.
getCount: method trả về số lượng phần tử mảng data hay giờ nó là số lượng view cần hiển thị lên ViewPager.
destroyItem: Xóa page từ ViewPager, ngoài ra ta có thể sử dụng hàm removeView() để xóa đi object hoặc removeViewAt() để xóa object dựa trên position.
isViewFromObject() : trả về object dựa trên instantiateItem đang hiển thị dựa vào position.

No comments:

Post a Comment