圖片來(lái)源于網(wǎng)絡(luò)
在日常的Android開(kāi)發(fā)當(dāng)中,ViewPager
是我們常用的組件之一痹仙。比如我常見(jiàn)的應(yīng)用引導(dǎo)頁(yè)拜姿、Banner自定義控件都有可能使用ViewPager來(lái)實(shí)現(xiàn)。這篇博客分享一下,我了解到的ViewPager
知識(shí)脐往。
ViewPager簡(jiǎn)介以及作用
ViewPager
,這個(gè)類可以讓用戶切換當(dāng)前的View
俱济。
- ViewPager類直接繼承了ViewGroup類,所以它是一個(gè)容器類钙勃,可以在其中添加其他View類。
- ViewPager類需要一個(gè)PagerAdapter適配器類給它提供數(shù)據(jù)聂喇。
- ViewPager經(jīng)常和Fragment一起使用辖源,并且提供了專門(mén)的FragmentPagerAdapter和FragmentStatePagerAdapter類供Fragment中的ViewPager使用。
ViewPager的使用
ViewPager的功能就是可以使視圖滑動(dòng)希太,就像Lancher左右滑動(dòng)那樣克饶。分三個(gè)步驟來(lái)使用它:
- 在XML文件中加入;
- 加載要顯示的頁(yè)卡誊辉;
- 在Activity里實(shí)例化ViewPager組件矾湃,并且設(shè)置Adapter(PagerAdapter,方法與ListView一樣的)堕澄,在這里一般需要重寫(xiě)PagerAdapter邀跃。)
XML使用示例
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
監(jiān)聽(tīng)事件設(shè)置
vp.addOnPageChangeListener(object :ViewPager.OnPageChangeListener{
override fun onPageScrolled( position: Int,positionOffset: Float,positionOffsetPixels: Int) {
// position,當(dāng)前頁(yè)面
// positionOffset,移動(dòng)頁(yè)面的百分比
// positionOffsetPixels,移動(dòng)的像素點(diǎn)
}
override fun onPageSelected(position: Int) {
// 當(dāng)頁(yè)面被選中
}
override fun onPageScrollStateChanged(state: Int) {
// 滑動(dòng)狀態(tài)發(fā)生改變
}
})
ViewPager的適配器
上面有提到提到了PagerAdapter,和ListView等控件使用一樣,需要ViewPager設(shè)置PagerAdapter來(lái)完成頁(yè)面和數(shù)據(jù)的綁定蛙紫,這個(gè)PagerAdapter是一個(gè)基類適配器拍屑,我們經(jīng)常用它來(lái)實(shí)現(xiàn)App引導(dǎo)頁(yè),它的子類有FragmentPagerAdapter和FragmentStatePagerAdapter,這兩個(gè)子類適配器用于和Fragment一起使用坑傅,在App中它們就像Listview一樣出現(xiàn)的頻繁僵驰。
實(shí)現(xiàn)一個(gè)最基本的PagerAdapter,必須實(shí)現(xiàn)下面的四個(gè)方法,在代碼中有注釋出來(lái):
public class MyAdapter extends PagerAdapter{
private List<View> list;
public MyAdapter(List<View> list){
this.list = list;
}
@Override
public int getCount() {
//必須實(shí)現(xiàn),返回要展示的圖片數(shù)量
return list.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
//必須實(shí)現(xiàn)
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
//必須實(shí)現(xiàn)唁毒,實(shí)例化
container.addView(list.get(position));
return list.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//必須實(shí)現(xiàn)蒜茴,銷毀
container.removeView(list.get(position));
}
}