干熟妇在线视频午夜剧场一级A级|99成人香视频日本两性激情视频|久久 午夜福利无码精品人妻一区|热久久超碰精品精品少妇一区二区|五月天综合在线国产一区免费视频|亚洲成人中心热re久久99|亚洲国产怡红院丁香五月综合h|玖玖九久久久午夜射精视频

十年專(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 6671

在南昌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)于A(yíng)PP開(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)
 
×
临城县| 疏附县| 鄂伦春自治旗| 会理县| 榕江县| 手机| 黎川县| 会宁县| 娄烦县| 吐鲁番市| 新丰县| 乐山市| 腾冲县| 哈巴河县| 芷江| 曲松县| 庆云县| 滦平县| 旺苍县| 濉溪县| 专栏| 南川市| 台山市| 花垣县| 安阳县| 昭通市| 德江县| 吴川市| 高密市| 临江市| 微博| 六枝特区| 冷水江市| 珲春市| 高雄县| 平罗县| 明溪县| 凭祥市| 怀柔区| 杭锦后旗| 林周县|