欧美亚洲大片-国产免费成人在线视频-国产成人8x人在线视频软件-日韩亚洲欧美中文字幕-97伦伦午夜电影理伦片-亚洲综合精品视频-曰本女人牲交高潮视频-久久久精品欧美-天天干天天操天天碰-精品国产乱码久久久久久1区2区-黄色一级免费片-在线免费欧美-国产成人精品在线视频-精人妻一区二区三区-香蕉视频2020-综合久久99-欧美日韩亚洲国产综合

十年專(zhuān)注于品牌網(wǎng)站建設(shè) 十余年專(zhuān)注于網(wǎng)站建設(shè)_小程序開(kāi)發(fā)_APP開(kāi)發(fā),低調(diào)、敢創(chuàng)新、有情懷!
南昌百恒網(wǎng)絡(luò)微信公眾號(hào) 掃一掃關(guān)注
小程序
tel-icon全國(guó)服務(wù)熱線(xiàn):400-680-9298,0791-88117053
掃一掃關(guān)注百恒網(wǎng)絡(luò)微信公眾號(hào)
掃一掃打開(kāi)百恒網(wǎng)絡(luò)微信小程序

百恒網(wǎng)絡(luò)

南昌百恒網(wǎng)絡(luò)

淺談Android開(kāi)發(fā)之ViewPager的工作原理

百恒網(wǎng)絡(luò) 2017-07-14 6993

在南昌APP開(kāi)發(fā)中,ViewPager 和PagerAdapter類(lèi)在后臺(tái)為我們完成了很多工作。那么ViewPager是如何工作的呢?在為大家介紹ViewPager的工作原理前,我們需要知道的是:大多情況下,我們無(wú)需了解其內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。不過(guò),如果要自己實(shí)現(xiàn)PagerAdapter接口,那就要了解ViewPager-PagerAdapter和Recycler-View-Adapter各自關(guān)系的異同了。

那么什么時(shí)候需要自己實(shí)現(xiàn)PagerAdapter接口呢?如果需要ViewPager托管非fragment視圖時(shí),那就需要實(shí)現(xiàn)原生PagerAdapter接口。例如,在ViewPager中托管圖片這樣的常見(jiàn)視圖對(duì)象時(shí)。

說(shuō)到這里,相信大家又有疑問(wèn)了,為什么選擇使用ViewPager而不是RecyclerView呢?別急,南昌APP制作開(kāi)發(fā)公司小編這就來(lái)告訴大家:

那是因?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類(lèi),而非原來(lái)的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銷(xiāo)毀已建視圖。注意,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來(lái)說(shuō),這是一個(gè)復(fù)雜的過(guò)程,但對(duì)于PagerAdapter來(lái)說(shuō),這算不上什么。因?yàn)镻agerAdapter只要能夠創(chuàng)建、銷(xiāo)毀視圖以及識(shí)別視圖來(lái)自哪個(gè)對(duì)象即可。這樣的要求顯然很寬松,因而PagerAdapter能夠比較自由地通過(guò)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便利類(lèi),以至于我們不會(huì)那么麻煩!

以上便是南昌APP開(kāi)發(fā)公司小編為大家介紹的關(guān)于APP開(kāi)發(fā)中ViewPager 的工作原理,如果想進(jìn)一步了解這方面的知識(shí)的朋友,歡迎大家繼續(xù)關(guān)注百恒網(wǎng)絡(luò)官網(wǎng)動(dòng)態(tài),我們將定期為您更新技術(shù)文章。如有需要APP開(kāi)發(fā)、網(wǎng)站建設(shè)等方面的服務(wù),可隨時(shí)來(lái)電和我們聯(lián)系,本公司隨時(shí)為您效勞。


400-680-9298,0791-88117053
掃一掃關(guān)注百恒網(wǎng)絡(luò)微信公眾號(hào)
掃一掃打開(kāi)百恒網(wǎng)絡(luò)小程序

歡迎您的光顧,我們將竭誠(chéng)為您服務(wù)×

售前咨詢(xún) 售前咨詢(xún)
 
售前咨詢(xún) 售前咨詢(xún)
 
售前咨詢(xún) 售前咨詢(xún)
 
售前咨詢(xún) 售前咨詢(xún)
 
售前咨詢(xún) 售前咨詢(xún)
 
售后服務(wù) 售后服務(wù)
 
售后服務(wù) 售后服務(wù)
 
備案專(zhuān)線(xiàn) 備案專(zhuān)線(xiàn)
 
×
探索| 牙克石市| 巴塘县| 无极县| 东宁县| 三都| 连城县| 龙口市| 阿勒泰市| 乐安县| 宣恩县| 通辽市| 咸丰县| 邓州市| 澜沧| 大同县| 璧山县| 陆丰市| 阿克苏市| 襄城县| 永善县| 珲春市| 许昌县| 五指山市| 灵川县| 宜阳县| 思茅市| 原阳县| 丽水市| 张掖市| 慈利县| 伊宁市| 金山区| 五家渠市| 黄梅县| 隆德县| 丰城市| 鱼台县| 巴青县| 南京市| 定南县|