1. 出現(xiàn)異常:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
原因:圖片資源少于4個(gè),對(duì)應(yīng)生成的ImageView也少于4個(gè)。
眾所周知,ViewPager一般會(huì)維護(hù)2~3個(gè)頁(yè),如果只有3個(gè)ImageView,很可能出現(xiàn)這種情況,在生成完3個(gè)Page頁(yè)后并準(zhǔn)備生成第4個(gè)頁(yè)面時(shí),本應(yīng)該移除的最前面的頁(yè)面還未被移除,系統(tǒng)就會(huì)報(bào)異常并且給你這樣一個(gè)提示:You must call removeView() on the child's parent first(意思是讓你先將最前面頁(yè)的子View從最前面頁(yè)移除掉,再將該子View添加到第4頁(yè)中)。
解決辦法:在只有1張圖片時(shí),不能滑動(dòng),暫不處理;如果有2~3張圖片時(shí),遞歸增加至大于等于4個(gè)ImageView為止(下方為小編解決該問(wèn)題的代碼)。
/** * 初始化ImageViews集合 * @param imageIds */ PRivate void initImageViews(int[] imageIds) { ...... // ImageViews集合中的圖片個(gè)數(shù)在[2,3]時(shí)會(huì)存在問(wèn)題,遞歸再次填充一遍 if(mImageViews.size() > 1 && mImageViews.size() < 4){ initImageViews(imageIds); } }2. 滑動(dòng)效果出現(xiàn)混亂(后面會(huì)附上混亂的效果圖)
原因:
ViewPager源碼本身存在問(wèn)題 - 數(shù)據(jù)范圍越界問(wèn)題。小編的獲取
ViewPager頁(yè)面數(shù)量的方法是這樣寫的:@Override public int getCount() { return mImageViews.size() <=1 ? mImageViews.size() : Short.MAX_VALUE; }小于1時(shí),頁(yè)面沒(méi)有滑動(dòng),不需要擴(kuò)充頁(yè)面數(shù)量;
大于1時(shí),取
Short取值范圍的最大值32767(我們會(huì)有3W多頁(yè)面,但不會(huì)同時(shí)存在,因?yàn)閂iewPager最多維持3個(gè)頁(yè)面)小編這里用的是Short,但一開(kāi)始從網(wǎng)上找的相似實(shí)現(xiàn)全是使用的
Integer(Integer.MAX_VALUE = 2147483647, 也就是我們的ViewPager將會(huì)有大概21億個(gè)頁(yè)面),如果使用Integer,比較細(xì)心的朋友會(huì)發(fā)現(xiàn)滑動(dòng)經(jīng)常出現(xiàn)混亂。頁(yè)面反向回彈Bug
我們松手時(shí),頁(yè)面出現(xiàn)反向回彈(1~2頁(yè)),這和我們期望的滑動(dòng)效果不一致。
這是其中一種Bug,還有一些不太好說(shuō)明的滑動(dòng)Bug,小編就用“滑動(dòng)混亂”這個(gè)名詞進(jìn)行解釋了...
解決辦法:縮小頁(yè)面數(shù)量(小編使用的
Short代替Integer減少了頁(yè)面)。具體的無(wú)Bug的臨界值,有興趣的小伙伴可以去實(shí)驗(yàn),小編的測(cè)試結(jié)果如下:
800萬(wàn)以內(nèi):基本無(wú)滑動(dòng)Bug;
1000萬(wàn)左右:開(kāi)始出現(xiàn)當(dāng)前頁(yè)面定位不準(zhǔn)確的Bug,但還未出現(xiàn)反向回彈Bug。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注