ViewPager
是Google的support.v4包中的支持控件,可以實(shí)現(xiàn)View之間的切換。
ViewPager
的使用在目前的應(yīng)用環(huán)境中非常頻繁,甚至對其進(jìn)行相關(guān)的自定義來實(shí)現(xiàn)一些特別的效果。
ViewPager
使用詳解系列只是對于Google官方提供的支持庫中的相關(guān)工具來實(shí)現(xiàn)效果,不涉及到自定義的東西。
ViewPager
最簡單的使用方法,就是與PagerAdapter
的配合使用,所以我們必須了解PagerAdapter
中的方法及其對應(yīng)的功能。
public class ViewPagerAdapter extends PagerAdapter {
/**
* 獲取View的總數(shù)
*
* @return View總數(shù)
*/
@Override
public int getCount() {
return 0;
}
/**
* 當(dāng)ViewPager的內(nèi)容有所變化時,進(jìn)行調(diào)用。
*
* @param container ViewPager本身
*/
@Override
public void startUpdate(ViewGroup container) {
super.startUpdate(container);
}
/**
* 為給定的位置創(chuàng)建相應(yīng)的View。創(chuàng)建View之后,需要在該方法中自行添加到container中。
*
* @param container ViewPager本身
* @param position 給定的位置
* @return 提交給ViewPager進(jìn)行保存的實(shí)例對象
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
/**
* 為給定的位置移除相應(yīng)的View。
*
* @param container ViewPager本身
* @param position 給定的位置
* @param object 在instantiateItem中提交給ViewPager進(jìn)行保存的實(shí)例對象
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
/**
* ViewPager調(diào)用該方法來通知PageAdapter當(dāng)前ViewPager顯示的主要項(xiàng),提供給用戶對主要項(xiàng)進(jìn)行操作的方法。
*
* @param container ViewPager本身
* @param position 給定的位置
* @param object 在instantiateItem中提交給ViewPager進(jìn)行保存的實(shí)例對象
*/
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
}
/**
* 當(dāng)ViewPager的內(nèi)容變化結(jié)束時,進(jìn)行調(diào)用。當(dāng)該方法被調(diào)用時,必須確定所有的操作已經(jīng)結(jié)束。
*
* @param container ViewPager本身
*/
@Override
public void finishUpdate(ViewGroup container) {
super.finishUpdate(container);
}
/**
* 確認(rèn)View與實(shí)例對象是否相互對應(yīng)。ViewPager內(nèi)部用于獲取View對應(yīng)的ItemInfo。
*
* @param view ViewPager顯示的View內(nèi)容
* @param object 在instantiateItem中提交給ViewPager進(jìn)行保存的實(shí)例對象
* @return 是否相互對應(yīng)
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return false;
}
/**
* 保存與PagerAdapter關(guān)聯(lián)的任何實(shí)例狀態(tài)。
*
* @return PagerAdapter保存狀態(tài)
*/
@Override
public Parcelable saveState() {
return super.saveState();
}
/**
* 恢復(fù)與PagerAdapter關(guān)聯(lián)的任何實(shí)例狀態(tài)。
*
* @param state PagerAdapter保存狀態(tài)
* @param loader 用于實(shí)例化還原對象的類加載器
*/
@Override
public void restoreState(Parcelable state, ClassLoader loader) {
super.restoreState(state, loader);
}
/**
* 當(dāng)ViewPager試圖確定某個項(xiàng)的位置是否已更改時調(diào)用。默認(rèn)有兩個可選項(xiàng):POSITION_UNCHANGED和POSITION_NONE。
* POSITION_UNCHANGED:給定項(xiàng)的位置未變更
* POSITION_NONE:給定項(xiàng)不再用于PagerAdapter中
* 其他值:可以根據(jù)具體的情況進(jìn)行調(diào)整
*
* @param object 在instantiateItem中提交給ViewPager進(jìn)行保存的實(shí)例對象
* @return
*/
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
/**
* 新增方法,目前較多用于Design庫中的TabLayout與ViewPager進(jìn)行綁定時,提供顯示的標(biāo)題。
*
* @param position 給定的位置
* @return 顯示的標(biāo)題
*/
@Override
public CharSequence getPageTitle(int position) {
return super.getPageTitle(position);
}
/**
* 獲取給定位置的View的顯示寬度比例,該比例是相對于ViewPager。
*
* @param position 給定的位置
* @return View顯示的寬度比例
*/
@Override
public float getPageWidth(int position) {
return super.getPageWidth(position);
}
}
當(dāng)然,這么多的方法,其實(shí)我們經(jīng)常使用到的只是其中的一部分而已,最簡單的SimplePagerAdapter
:
public class SimplePagerAdapter extends PagerAdapter {
private LayoutInflater mInflater;
public SimplePagerAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return 5;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
return DataBindingUtil.inflate(mInflater, R.layout.item_simple_pager, container, true);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
ItemSimplePagerBinding dataBinding = (ItemSimplePagerBinding) object;
container.removeView(dataBinding.getRoot());
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
ItemSimplePagerBinding dataBinding = (ItemSimplePagerBinding) object;
dataBinding.tvContent.setText(getPageTitle(position));
}
@Override
public boolean isViewFromObject(View view, Object object) {
ItemSimplePagerBinding dataBinding = (ItemSimplePagerBinding) object;
return dataBinding.getRoot() == view;
}
@Override
public CharSequence getPageTitle(int position) {
return String.valueOf(position + 1);
}
}
在SimplePagerAdapter
中使用到了DataBinding
,DataBinding
的使用可以通過我的另一篇文章來了解。
網(wǎng)絡(luò)上的其他關(guān)于PagerAdapter
的使用,有很多人直接在instantiateItem
中進(jìn)行View的數(shù)據(jù)更新,這種方式也是可行,但建議將View的創(chuàng)建與數(shù)據(jù)的更新區(qū)分開,這樣結(jié)構(gòu)清晰,而且便于數(shù)據(jù)的操作。