ListView之解決加載錯位

在使用ListView時铝条,很多情況下由于某些數(shù)據(jù)的加載不能立刻完成邓馒,為了防止UI線程的阻塞我們通常會采用異步加載數(shù)據(jù)的方式碴巾。這時就會產(chǎn)生一個問題:數(shù)據(jù)加載錯位墙杯!

原因分析

造成ListView的數(shù)據(jù)加載錯位是由于我們同時使用convertView和異步加載引起的配并。

  • 圖一:假設(shè)我們屏幕上一開始顯示了5個完整的Item,針對這5個Item convertView都為null高镐。
  • 圖二:當(dāng)?shù)?個Item有一半移出屏幕溉旋,第6個Item有一半移入屏幕時,屏幕上顯示的Item條目數(shù)最多嫉髓。也即我們擁有6個不同的convertView观腊。
  • 圖三:當(dāng)?shù)?個Item完全滑出屏幕之后,如果第7個Item進入屏幕算行,則此時會復(fù)用與第1個Item相關(guān)聯(lián)的convertView恕沫。

Paste_Image.png

假設(shè)我們的第一個Item的數(shù)據(jù)加載需要較長的時間,我們采用了異步加載的方式纱意。想像一下當(dāng)我們已經(jīng)啟動了異步加載線程婶溯,但是在數(shù)據(jù)還沒有完全加載完成的時候,我們的ListView的狀態(tài)已經(jīng)由圖一變成了圖三。此時如果加載完畢迄委,由于數(shù)據(jù)加載線程并不知道ListView已經(jīng)發(fā)生了改變褐筛,依舊會將數(shù)據(jù)更新至與Item1相關(guān)聯(lián)的convertView上。此時Item7就會顯示Item1的數(shù)據(jù)!!這就是所謂的ListView加載錯位叙身。

問題解決

追根究底加載錯位的問題出在加載線程在數(shù)據(jù)加載完畢之后不知道ListView已經(jīng)發(fā)生了改變渔扎,從這一點考慮我們可以通過以下步驟進行解決:

  1. 在啟動加載線程之前給每個Item的控件設(shè)定與當(dāng)前Item關(guān)聯(lián)的Tag.
  2. 在數(shù)據(jù)加載完畢之后通過從控件中g(shù)etTag()的方法判斷是否為“正確”的關(guān)聯(lián)控件。

核心代碼實現(xiàn):

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v;
    final ViewHolder viewHolder;
    final TypeInfo typeInfo = getItem(position);
    Log.d("MyAdapter", "convertView:"+convertView+" position="+position);
    if(convertView == null){
        v= mInflater.inflate(mLayoutId, parent, false);
        viewHolder = new ViewHolder();
        viewHolder.tv_title = (TextView)v.findViewById(R.id.title);
        viewHolder.iv_pic = (ImageView)v.findViewById(R.id.pic);
        v.setTag(viewHolder);
    }
    else{
        v = convertView;
        viewHolder = (ViewHolder)v.getTag();
    }
    viewHolder.tv_title.setText(typeInfo.typeTitle);
    // ------1.不添加以下代碼則會造成圖片錯位
    viewHolder.iv_pic.setTag(typeInfo.typeTitle);
    // ------
    if(position == 0){
        viewHolder.iv_pic.setImageDrawable(new BitmapDrawable());
        // 模擬網(wǎng)絡(luò)信轿、文件加載圖片的時間晃痴,這里假設(shè)加載用了3s
        mHandler.postDelayed(new Runnable() {
            
            @Override
            public void run() {
                //注意這里的typeInfo.typeTitle是在啟動線程的時候就已經(jīng)獲取到值了,而不是run到此處時才獲取到的值
                Log.d("MyAdapter", "tag:"+typeInfo.typeTitle);
                //運行到此處時模擬加載已經(jīng)完成
                // ------2.不添加以下代碼則會造成圖片錯位
                Log.d("MyAdapter","tag:"+viewHolder.iv_pic.getTag());
                if(viewHolder.iv_pic.getTag() == null)
                    return;
                if(!viewHolder.iv_pic.getTag().equals(typeInfo.typeTitle))//不是真正的pos0的imageView控件
                    return;//do nothing
                // ------
                viewHolder.iv_pic.setImageResource(typeInfo.typePic);               
            }

        }, 3000);
    }else{
        viewHolder.iv_pic.setImageResource(typeInfo.typePic);
    }
    return v;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市财忽,隨后出現(xiàn)的幾起案子倘核,更是在濱河造成了極大的恐慌,老刑警劉巖即彪,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紧唱,死亡現(xiàn)場離奇詭異,居然都是意外死亡隶校,警方通過查閱死者的電腦和手機漏益,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來深胳,“玉大人绰疤,你說我怎么就攤上這事∥柚眨” “怎么了轻庆?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長权埠。 經(jīng)常有香客問我榨了,道長煎谍,這世上最難降的妖魔是什么攘蔽? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮呐粘,結(jié)果婚禮上满俗,老公的妹妹穿的比我還像新娘。我一直安慰自己作岖,他們只是感情好唆垃,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痘儡,像睡著了一般辕万。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天渐尿,我揣著相機與錄音醉途,去河邊找鬼。 笑死砖茸,一個胖子當(dāng)著我的面吹牛隘擎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凉夯,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼货葬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劲够?” 一聲冷哼從身側(cè)響起震桶,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎再沧,沒想到半個月后尼夺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡炒瘸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年淤堵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顷扩。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拐邪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隘截,到底是詐尸還是另有隱情扎阶,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布婶芭,位于F島的核電站东臀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏犀农。R本人自食惡果不足惜惰赋,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呵哨。 院中可真熱鬧赁濒,春花似錦、人聲如沸孟害。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挨务。三九已至击你,卻和暖如春玉组,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丁侄。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工球切, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绒障。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓吨凑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親户辱。 傳聞我的和親對象是個殘疾皇子鸵钝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容