PagerAdapter的setPrimaryItem無限調(diào)用

最近做項(xiàng)目遇到一個tab切換的選項(xiàng)的需求類似輪播圖损姜,用的是viewpager來做的据悔,遇到的問題是每個item的高度不一樣剿吻,所以在切換時需要每次去重新計算viewpager的高度箱玷,所以自定義了一個viewpager重寫onMeasure方法:

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if(this.mCurrentView == null) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        } else {
            int height = 0;
            this.mCurrentView.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, 0));
            int h = this.mCurrentView.getMeasuredHeight();
            if(h > height) {
                height = h;
            }

            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, 1073741824);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

然后在setPrimaryItem中重新設(shè)置viewpager高度

 @Override
 public void setPrimaryItem(ViewGroup container, int position, Object object) {
       super.setPrimaryItem(container, position, object);
       View view= (View) object;
       ((CustomPager) container).measureCurrentView(view);
 }

但是在實(shí)際使用中發(fā)現(xiàn)setPrimaryItem會連續(xù)不斷的調(diào)用吮龄,最后研究后發(fā)現(xiàn)viewpager的onMeasure方法中會調(diào)用populate方法拷窜,而populate方法會調(diào)用setPrimaryItem方法开皿,所以才會導(dǎo)致死循環(huán),結(jié)果就是setPrimaryItem方法無限調(diào)用:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     //省略部分源碼
    populate(); 
}

void populate(int newCurrentItem) {
     //省略部分源碼
    mAdapter.setPrimaryItem(this, mCurItem, curItem != null ? curItem.object : null);
}

解決方法是重新自定義一個pageradapter篮昧,在里面記錄當(dāng)前的位置赋荆,位置變化時才會調(diào)用重新設(shè)置viewpager高度的方法:

public abstract class BasePagerAdapter extends PagerAdapter {
    private int lastPosition = -1;

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        super.setPrimaryItem(container, position, object);
        if (lastPosition != position && object instanceof DatePickerView && container instanceof CustomPager) {
            lastPosition = position;
            View view = (View) object;
            ((CustomPager) container).measureCurrentView(view);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市懊昨,隨后出現(xiàn)的幾起案子窄潭,更是在濱河造成了極大的恐慌,老刑警劉巖酵颁,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫉你,死亡現(xiàn)場離奇詭異,居然都是意外死亡躏惋,警方通過查閱死者的電腦和手機(jī)幽污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來其掂,“玉大人油挥,你說我怎么就攤上這事】畎荆” “怎么了深寥?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贤牛。 經(jīng)常有香客問我惋鹅,道長,這世上最難降的妖魔是什么殉簸? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任闰集,我火速辦了婚禮沽讹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘武鲁。我一直安慰自己爽雄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布沐鼠。 她就那樣靜靜地躺著挚瘟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饲梭。 梳的紋絲不亂的頭發(fā)上乘盖,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音憔涉,去河邊找鬼订框。 笑死,一個胖子當(dāng)著我的面吹牛兜叨,可吹牛的內(nèi)容都是我干的穿扳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浪腐,長吁一口氣:“原來是場噩夢啊……” “哼纵揍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起议街,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤泽谨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后特漩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吧雹,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年涂身,在試婚紗的時候發(fā)現(xiàn)自己被綠了雄卷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛤售,死狀恐怖丁鹉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悴能,我是刑警寧澤揣钦,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏观话。R本人自食惡果不足惜蹬铺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一宇姚、第九天 我趴在偏房一處隱蔽的房頂上張望匈庭。 院中可真熱鬧,春花似錦浑劳、人聲如沸阱持。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽紊选。三九已至,卻和暖如春道逗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背献烦。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工滓窍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巩那。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓吏夯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親即横。 傳聞我的和親對象是個殘疾皇子噪生,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353