這篇“Android開發(fā)之ViewPager的工作原理是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android開發(fā)之ViewPager的工作原理是什么”文章吧。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括大通網(wǎng)站建設(shè)、大通網(wǎng)站制作、大通網(wǎng)頁(yè)制作以及大通網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,大通網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到大通省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
在APP開發(fā)中,ViewPager 和PagerAdapter類在后臺(tái)為我們完成了很多工作。那么ViewPager是如何工作的呢?在為大家介紹ViewPager的工作原理前,我們需要知道的是:大多情況下,我們無(wú)需了解其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。不過,如果要自己實(shí)現(xiàn)PagerAdapter接口,那就要了解ViewPager-PagerAdapter和Recycler-View-Adapter各自關(guān)系的異同了。
那么什么時(shí)候需要自己實(shí)現(xiàn)PagerAdapter接口呢?如果需要ViewPager托管非fragment視圖時(shí),那就需要實(shí)現(xiàn)原生PagerAdapter接口。例如,在ViewPager中托管圖片這樣的常見視圖對(duì)象時(shí)。
說到這里,相信大家又有疑問了,為什么選擇使用ViewPager而不是RecyclerView呢?別急,南昌APP制作開發(fā)公司小編這就來告訴大家:
那是因?yàn)橛捎跓o(wú)法使用現(xiàn)有的Fragment,在CriminalIntent應(yīng)用中使用RecyclerView需處理大量?jī)?nèi)部實(shí)現(xiàn)工作。Adapter需要我們及時(shí)地提供View。然而,決定fragment視圖何時(shí)創(chuàng)建的是FragmentManager。因此,當(dāng)RecyclerView要求Adapter提供fragment視圖時(shí),我們無(wú)法立即創(chuàng)建fragment并提供其視圖。
這就是ViewPager存在的原因。它使用的是PagerAdapter類,而非原來的Adapter。PagerAdapter要比Adapter復(fù)雜得多,因?yàn)樗幚砀嗟囊晥D管理工作。以下為它的基本內(nèi)部實(shí)現(xiàn)。
PagerAdapter不使用可返回視圖的onBindViewHolder(...)方法,而是使用下列方法:
public Object instantiateItem(ViewGroup container, int position)
public void destroyItem(ViewGroup container, int position, Object object)
public abstract boolean isViewFromObject(View view, Object object)
PagerAdapter.instantiateItem(ViewGroup, int)方法告訴pager adapter創(chuàng)建指定位置的列表項(xiàng)視圖,然后將其添加給ViewGroup視圖容器,而destroyItem(ViewGroup, int,Object)方法則告訴pager adapter銷毀已建視圖。注意,instantiateItem(ViewGroup, int)方法并不要求立即創(chuàng)建視圖。因此,PagerAdapter可自行決定何時(shí)創(chuàng)建視圖。
視圖創(chuàng)建完成后,ViewPager會(huì)在某個(gè)時(shí)間點(diǎn)注意到它。為確定該視圖所屬的對(duì)象,ViewPager會(huì)調(diào)用isViewFromObject(View, Object) 方法。這里, Object 參數(shù)是instantiateItem(ViewGroup,int)方法返回的對(duì)象。因此,假設(shè)ViewPager調(diào)用instantiateItem(ViewGroup, 5)方法返回一個(gè)A對(duì)象,那么只要傳入的View參數(shù)是第5個(gè)對(duì)象的視圖,isViewFromObject(View, A)方法就應(yīng)返回true值,否則返回false值。
對(duì)ViewPager來說,這是一個(gè)復(fù)雜的過程,但對(duì)于PagerAdapter來說,這算不上什么。因?yàn)镻agerAdapter只要能夠創(chuàng)建、銷毀視圖以及識(shí)別視圖來自哪個(gè)對(duì)象即可。這樣的要求顯然很寬松,因而PagerAdapter能夠比較自由地通過instantiateItem(ViewGroup, int)方法創(chuàng)建并添加新的fragment,然后返回可以跟蹤管理的Object(fragment)。以下為isViewFromObject(View, Object)方法的具體實(shí)現(xiàn):
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment)object).getView() == view;
}
可以看到,每次需要使用ViewPager時(shí),都要覆蓋實(shí)現(xiàn)PagerAdapter的這些方法,這真是一種磨難。幸好我們有FragmentPagerAdapter和FragmentStatePagerAdapter便利類,以至于我們不會(huì)那么麻煩!
以上就是關(guān)于“Android開發(fā)之ViewPager的工作原理是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。