一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android ListView中item view重復(fù)使用帶來的問題

 guitarhua 2016-05-16

本文主要介紹ListView中item view的重復(fù)使用、可能帶來的出錯情況以及解決方案。

 

1、為什么item View重復(fù)使用及如何重復(fù)使用

熟悉ListView的朋友都知道,在ListView的每個item需要花較大的時間進行渲染(比如需要網(wǎng)絡(luò)獲取數(shù)據(jù)、圖片)時,為了使得ListView能夠平滑的上下滑動,需要對listView的adapter做一些性能優(yōu)化,比如數(shù)據(jù)(圖片)異步加載、重復(fù)使用item的view

 

其中item的重復(fù)使用代碼如下

  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3.     if (convertView == null && context != null) {  
  4.         convertView = inflater.inflate(R.layout.list_activity, null);  
  5.     }  
  6.     ……  
  7. }  

可以發(fā)現(xiàn)上面主要通過判斷convertView若不為空進行重復(fù)使用,節(jié)省資源加載和創(chuàng)建的時間。然后這種重用之前的convertView會對當(dāng)前的顯示有一定影響。

 

2、可能出錯情況

a、convertView包含TextView

之前的convertView會顯示某個textView,但當(dāng)前我并不需要顯示了沒有問題,而因為重用會導(dǎo)致仍會顯示。

 

b、convertView包含ImageView,且異步設(shè)置ImageView中ImageResource時的問題

調(diào)試adapter的getView函數(shù)就會發(fā)現(xiàn),頭3個item都是重用第1個item的,所以若異步修改第2和第3個item的imageView第1個也會被修改,導(dǎo)致第1個item的imageView不斷閃爍

我的補充:

這種情況發(fā)生的原因是因為ListView沒辦法確定它一次需要實例化多少個 convertView,即調(diào)用多少次getView方法。而導(dǎo)致這樣的結(jié)果可能有以下原因:

1、你自己重寫的ListView在實例化以后直接使用,而沒有給它指定高度和寬度。

2、將ListView布局在xml中高度值指定為了Wrap_Content

3、將ListView布局到一個父組件,ListView本身的height是fillParent,但是父類組件在其父組件中高度為Wrap_Content 等

如:

  1.      .....省略以上  
  2.      android:id="@+id/all"  
  3.         />  
  4.       
  5. </RelativeLayout>  
  6.   
  7. <LinearLayout   
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="<strong>wrap_content</strong>"  
  10.     >  
  11.     <ListView   
  12.          android:layout_width="fill_parent"  
  13.         android:layout_height="<strong>fill_parent</strong>"  
  14.         ></ListView>  
  15. </LinearLayout>  
  16.   
  17. /LinearLayout>  


c、convertView包含TextView ,且異步設(shè)置 TextView中圖片時的問題

在textView中使用setCompoundDrawablesWithIntrinsicBounds添加圖片,若第3個item 的textView異步添加了圖片,第1個也會相應(yīng)被加上

 

具體原因還沒debug出來,暫時的解決方法有兩個

3、解決方案

a、正確性優(yōu)先,去除性能優(yōu)化  ===== 我不大贊成,以上所有的出錯方案都可以通過調(diào)整邏輯來達到理想效果并且保持性能

即不再重用convertView,每次重新賦值

  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3.     convertView = inflater.inflate(R.layout.list_activity, null);  
  4.     ……  
  5. }  
 

b、初始化每個Item View中的出錯元素

比如對于可能出錯情況a的解決如下:

  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3.     if (convertView == null && inflater != null) {  
  4.         convertView = inflater.inflate(R.layout.status_activity, parent, false);  
  5.     }  
  6.       
  7.     TextView tx = (TextView)convertView.findViewById(R.id.contentTextView);  
  8.     if (contentList.get(position) == null) {  
  9.         tx.setVisibility(View.GONE);  
  10.     } else {  
  11.         ……  
  12.     }  
  13. }  

其中if (contentList.get(position) == null) 即表示消除之前的convertView的影響。

其他元素初始設(shè)置類似,如ImageView的ImageResource。

 

這種方法對于很多View需要初始化時較麻煩,若出錯view太多還是使用第一種解決方案方便些,畢竟很多時候性能不會那么差。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日本东京热视频一区二区三区| 东京热男人的天堂久久综合| 日韩欧美精品一区二区三区| 免费一级欧美大片免费看| 欧美日韩成人在线一区| 日本一本不卡免费视频| 久久综合亚洲精品蜜桃| 国产成人午夜在线视频| 欧美韩国日本精品在线| 亚洲国产成人精品一区刚刚| 日韩中文高清在线专区| 亚洲欧美日韩国产综合在线| 粗暴蹂躏中文一区二区三区| 亚洲精品福利视频你懂的| 欧美在线观看视频三区| 好吊色免费在线观看视频| 亚洲最大福利在线观看| 日本加勒比不卡二三四区| 高清免费在线不卡视频| 国产成人午夜av一区二区| 日本人妻丰满熟妇久久| 丁香六月啪啪激情综合区| 成人日韩视频中文字幕| 国产女性精品一区二区三区| 99久久国产亚洲综合精品| 国产午夜精品在线免费看| 亚洲欧美日本国产有色| 国产成人精品午夜福利av免费| 99精品国产自在现线观看| 免费在线成人激情视频| 国产成人午夜福利片片| 高跟丝袜av在线一区二区三区| 日本男人女人干逼视频| 亚洲男人的天堂色偷偷| 五月天丁香婷婷一区二区| 亚洲精品美女三级完整版视频| 国产亚洲午夜高清国产拍精品| 日韩中文字幕有码午夜美女| 国产91人妻精品一区二区三区| 日本一本在线免费福利| 亚洲在线观看福利视频|