日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android在ListView滑动数据混乱

發(fā)布時(shí)間:2025/7/14 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android在ListView滑动数据混乱 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我相信做過Android應(yīng)用程序開發(fā)或多或少都遇到了這個(gè)問題。或者是在ListView數(shù)據(jù)損壞幻燈片事件。要么GridView數(shù)據(jù)損壞幻燈片事件。

讓我們來看看一個(gè)網(wǎng)友寫的文章,個(gè)人感覺還不錯(cuò)的文章:


Android ListView滑動(dòng)過程中圖片顯示反復(fù)錯(cuò)位閃爍問題解決

主要分析Android ListView滾動(dòng)過程中圖片顯示反復(fù)、錯(cuò)亂、閃爍的原因及解決方法,順帶提及ListView的緩存機(jī)制。


1、原因分析
ListView item緩存機(jī)制
:為了使得性能更優(yōu)。ListView會(huì)緩存行item(某行相應(yīng)的View)。ListView通過adapter的getView函數(shù)獲得每行的item。滑動(dòng)過程中,

a. 假設(shè)某行item已經(jīng)滑出屏幕,若該item不在緩存內(nèi),則put進(jìn)緩存,否則更新緩存。
b. 獲取滑入屏幕的行item之前會(huì)先推斷緩存中是否有可用的item,假設(shè)有,做為convertView參數(shù)傳遞給adapter的getView。


更詳細(xì)可見源代碼ListView.obtainView。

?

這樣,例如以下的getView寫法就能夠充分利用緩存大大提升ListView的性能。即便上萬個(gè)行item。最多inflate的次數(shù)為n,n為一屏最多顯示ListView 行item的個(gè)數(shù)。

ListView Adapter getView寫法 Java
123456789101112131415161718192021222324@Overridepublic View getView(int position, View convertView, ViewGroup parent) {????ViewHolder holder;????if (convertView == null) {????????convertView = inflater.inflate(R.layout.list_item, null);????????holder = new ViewHolder();????????……????????convertView.setTag(holder);????} else {????????holder = (ViewHolder)convertView.getTag();????}}/** * ViewHolder * * @author trinea@trinea.cn 2013-08-01 */private static class ViewHolder {????ImageView appIcon;????TextView??appName;????TextView??appInfo;}

這樣提升了性能。但同一時(shí)候也會(huì)造成另外一些問題:

a. 行item圖片顯示反復(fù)
這個(gè)顯示反復(fù)是指當(dāng)前行item顯示了之前某行item的圖片。


比方ListView滑動(dòng)到第2行會(huì)異步載入某個(gè)圖片,可是載入非常慢,載入過程中l(wèi)istView已經(jīng)滑動(dòng)到了第14行,且滑動(dòng)過程中該圖片載入結(jié)束。第2行已不在屏幕內(nèi),依據(jù)上面介紹的緩存原理,第2行的view可能被第14行復(fù)用,這樣我們看到的就是第14行顯示了本該屬于第2行的圖片。造成顯示反復(fù)。

?

b. 行item圖片顯示錯(cuò)亂
這個(gè)顯示錯(cuò)亂是指某行item顯示了不屬于該行item的圖片。
比方ListView滑動(dòng)到第2行會(huì)異步載入某個(gè)圖片。可是載入非常慢。載入過程中l(wèi)istView已經(jīng)滑動(dòng)到了第14行。第2行已不在屏幕內(nèi)。依據(jù)上面介紹的緩存原理,第2行的view可能被第14行復(fù)用,第14行顯示了第2行的View,這時(shí)之前的圖片載入結(jié)束,就會(huì)顯示在第14行,造成錯(cuò)亂。

?

c. 行item圖片顯示閃爍
上面b的情況,第14行圖片又非常快載入結(jié)束。所以我們看到第14行先顯示了第2行的圖片,立刻又顯示了自己的圖片進(jìn)行覆蓋造成閃爍錯(cuò)亂。

?

2、解決方法
通過上面的分析我們知道了出現(xiàn)錯(cuò)亂的原因是異步載入及對(duì)象被復(fù)用造成的。假設(shè)每次getView能給對(duì)象一個(gè)標(biāo)識(shí),在異步載入完畢時(shí)比較標(biāo)識(shí)與當(dāng)前行item的標(biāo)識(shí)是否一致,一致則顯示,否則不做處理就可以。
以下以使用ImageCache為ListView提供圖片獲取緩存為例,ListView中強(qiáng)烈推薦使用ImageCache。


首先在listview adapter的getView中加入

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ ????ViewHolderholder; ????if(convertView==null){ ????????convertView=inflater.inflate(R.layout.list_item,null); ????????holder=newViewHolder(); ????????…… ????????convertView.setTag(holder); ????}else{ ????????holder=(ViewHolder)convertView.getTag(); ????} ????…… ????// add tag for image, to compare it when image loaded finish ????imageView.setTag(imageUrl); ????// if not in cache, restore default ????if(!Cache.ICON_CACHE.get(imageUrl,imageView)){ ????????imageView.setImageDrawable(null); ????} }

當(dāng)中setTag表示設(shè)置標(biāo)識(shí),方便以下進(jìn)行標(biāo)志比對(duì)

1if (!Cache.ICON_CACHE.get(imageUrl, imageView))

Cache.ICON_CACHE為ImageCache的實(shí)例。表示假設(shè)不在緩存內(nèi)則設(shè)置drawable為null(當(dāng)然你能夠能夠設(shè)置為你自己的默認(rèn)資源),防止顯示了之前某個(gè)行item的圖片,攻克了a. 行item圖片顯示反復(fù)問題。

?

在ImageCache的OnImageCallbackListener的onGetSuccess函數(shù)中加入

Java
1 2 3 4 5 6 7 8 9 10 11 publicvoidonGetSuccess(StringimageUrl,DrawableimageDrawable,Viewview,booleanisInCache){ ????// can be another view child, like textView and so on ????if(view!=null&&imageDrawable!=null){ ????????ImageViewimageView=(ImageView)view; ????????// add tag judge, avoid listView cache and so on ????????StringimageUrlTag=(String)imageView.getTag(); ????????if(ObjectUtils.isEquals(imageUrlTag,imageUrl)){ ????????????imageView.setImageDrawable(imageDrawable); ????????} ????} };

在上面用String imageUrlTag = (String)imageView.getTag();取得之前設(shè)置的tag,然后和當(dāng)前的url進(jìn)行比較,假設(shè)相等則顯示,攻克了b. 行item圖片顯示錯(cuò)亂。c. 行item圖片顯示錯(cuò)亂的兩個(gè)問題。

當(dāng)中ObjectUtils可見ObjectUtils@Github.

其它異步載入過程解決原理類似。

插一句:標(biāo)題上我加了此文章的原文鏈接。


大家通過上面的文字能夠發(fā)現(xiàn),混亂的本質(zhì)原因是因?yàn)槭褂昧薞iewHolder以及ListView的Item的緩存機(jī)制。所以在解決本類問題時(shí)也就分為兩種方法:

(1)把上文中if(convertView==null){}else{holder=(ViewHolder)convertView.getTag()?}給凝視 掉,然后數(shù)據(jù)混亂的問題就得以攻克了,可是這樣問題盡管攻克了,應(yīng)用程序性能就減少了。顯然此種方法雖能解決這個(gè)問題,可是還是不建議使用。

(2)就是通過加入Tag標(biāo)記,可是盡管是說加入Tag標(biāo)記,每個(gè)應(yīng)用程序加入Tag的方法不同。故在此無法給出一個(gè)統(tǒng)一的解決方法,僅僅能說一個(gè)統(tǒng)一的解決思路。比如:假設(shè)混亂的是一件商品的數(shù)量,能夠把商品的數(shù)量暫時(shí)存到一個(gè)數(shù)組中,然后每次取值都從數(shù)組里取值即可了。事實(shí)上說白了,就是依據(jù)詳細(xì)的情況new 一個(gè)對(duì)應(yīng)的數(shù)組,來做數(shù)據(jù)的中轉(zhuǎn)站。例如以下圖情形:

在滑動(dòng)時(shí),我們會(huì)發(fā)現(xiàn)數(shù)量的值會(huì)發(fā)生混亂,或者在加減右圖中的數(shù)字時(shí),也會(huì)出現(xiàn)這種情況。

以下提供一個(gè)類似的方案。事實(shí)上對(duì)應(yīng)的代碼都是在你應(yīng)用中的Adapter中改動(dòng)。

首先聲明一個(gè)數(shù)組用于存放數(shù)量:

private int [] tempNum;

然后在本Adapter的構(gòu)造方法中初始化此數(shù)組:tempNum=new int[this.list.size()];

然后在getView方法中一定要有例如以下代碼:mItemViewHolder.mTvNum.setTag(position);

mItemViewHolder.mTvNum.setText(tempNum[position]+"");

然后在加減時(shí)。也要把最新的數(shù)量存到數(shù)組里。例如以下:

<span style="white-space:pre"> </span>case R.id.menu_reduce_iv:mTextView=(TextView)v.getTag(R.id.menu_num_tv);num=Integer.valueOf(mTextView.getText().toString().trim());num--;tempNum[(Integer)mTextView.getTag()]=num;if(num<0){Toast.makeText(context, "親,不能再減了,趕緊加加吧。", Toast.LENGTH_SHORT).show();}else{mTextView.setText( tempNum[(Integer)mTextView.getTag()]+"");}break;case R.id.menu_add_iv:mTextView=(TextView)v.getTag(R.id.menu_num_tv);num=Integer.valueOf(mTextView.getText().toString().trim());num++;tempNum[(Integer)mTextView.getTag()]=num;mTextView.setText(tempNum[(Integer)mTextView.getTag()]+"");break;

總之。在做此類處理時(shí),一定要new一個(gè)數(shù)組,然后在混亂的地方一定要setTag。

大致就說到這里,鄙人才疏學(xué)淺,有不正確之處,望大家及時(shí)指出。轉(zhuǎn)載請(qǐng)注明:http://blog.csdn.net/android_jiangjun/article/details/39924541


版權(quán)聲明:本文博客原創(chuàng)文章,博客,未經(jīng)同意,不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的Android在ListView滑动数据混乱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: juliaann精品艳妇hd| 日本熟妇浓毛 | 欧美视频网站 | 欧美日韩国产高清视频 | 国精产品一区一区三区免费视频 | 无遮挡aaaaa大片免费看 | 日韩专区第一页 | 国产极品视频在线观看 | 99久久99久久精品免费看蜜桃 | 成人网在线 | 国产精品1234区 | 特级黄毛片 | 日本视频免费看 | 欧美破处大片 | 手机av免费 | 欧美亚洲图片小说 | 久草视频在线资源站 | 亚洲高清视频免费观看 | 99久久婷婷国产精品综合 | 性盈盈影院中文字幕 | 欧美aaa大片 | 99热这里只有精品18 | 欧美偷拍视频 | 美女黄色一级视频 | 欧美123| 超碰成人在线观看 | 免费午夜影院 | 中文字幕在线观看视频一区二区 | 中文字幕综合网 | 婷婷综合激情网 | 人妻精品一区二区三区 | 久久亚洲av无码精品色午夜麻豆 | 日人视频| 亚洲综合久久婷婷 | 啪啪官网 | 男人的天堂2019 | 中文字幕被公侵犯的漂亮人妻 | 在线免费黄色网址 | 亚洲一区二区蜜桃 | 肉番在线观看 | 亚洲 欧美 日韩在线 | 91超碰在线观看 | 67194少妇在线观看 | 日日综合 | 成人午夜网址 | 91在线视频导航 | 亚洲2022国产成人精品无码区 | 污污的网站在线观看 | 亚洲男女在线 | 免费成人美女在线观看 | 九九天堂 | 午夜免费播放观看在线视频 | 国产又粗又猛又爽 | 日韩色 | 久久青青视频 | www中文字幕在线观看 | 午夜激情综合网 | 另类二区 | 国产女教师一区二区三区 | 午夜高清 | 日韩欧美99| 亚洲热热| av私库| 爱吃波客今天最新视频 | 色欲av永久无码精品无码蜜桃 | 高潮网址| 艳妇乳肉豪妇荡乳av无码福利 | 一区二区中文字幕在线观看 | 欧美色图在线播放 | 乱短篇艳辣500篇h文最新章节 | 五月婷婷丁香激情 | 欧美一级二级三级视频 | 日日夜夜人人 | 亚洲一线二线在线观看 | 日本大胆人体视频 | 日本欧美在线播放 | 国产精品6666 | 快播久久| 人人射人人爱 | 日韩一区二区毛片 | 3d动漫精品啪啪一区二区竹菊 | 日本亲子乱子伦xxxx50路 | 国产美女引诱水电工 | 日韩美一区二区三区 | 成年人黄色网址 | 国产一区二区三区电影在线观看 | 中文字幕av在线 | 亚洲性图视频 | 伊人久久狼人 | 欧美性做爰猛烈叫床潮 | 亚洲av成人无码久久精品 | 中国女人一级一次看片 | 亚洲色成人www永久网站 | 日韩毛片一级 | 久久女人天堂 | 欧美黄色大片网站 | 欧洲视频在线观看 | 国产一页 | 国产精品一区在线播放 |