1. 程式人生 > >解決ListView 快取機制帶來的顯示不正常問題

解決ListView 快取機制帶來的顯示不正常問題

ListView載入資料原理:系統繪製ListView時,首先會用getCount()函式得到要繪製的這個列表的長度,然後開始逐行繪製。然後呼叫getView()函式,在這個函式裡面首先獲得一個View(簡單item,如字串或者單個元件的顯示則是View,自定義的item,包含很多控制元件的時候是一個ViewGroup),然後再例項化並設定各個元件及其資料內容並顯示它。如果我們有大量的item要顯示怎麼辦?不可能為每個Item建立一個新的View,這會消耗大量的記憶體,可能會OOM!解決辦法就是快取View然後重複利用。這個圖是解釋了系統快取的過程,當有前面的Item已經劃出螢幕時,它的View將被後面的Item複用。http://img1.51cto.com/attachment/201206/102950574.jpg


顯示不正常問題:快取機制固然很好,但在使用時要特別注意。比如,前面的Item裡面的元件的資料也會被帶到將要複用的Item中,從而導致顯示錯誤。

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		Holder holder = null;
		convertView = null; //禁用快取機制
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.bus_unit, parent, false);
			holder = new Holder();

			holder.station = (TextView) convertView
					.findViewById(R.id.textView_station);


解決辦法:最簡單的方法就是禁用它的快取機制,這隻適用於Item比較少的情況。

對於Item比較多的情況,這樣的解決辦法顯然是不合適的。另外一種解決辦法其實也挺簡單的,只要將Item中的元件資料再初始化為原來的狀態就行了。

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		Holder holder = null;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.bus_unit, parent, false);
			holder = new Holder();

			holder.station = (TextView) convertView
					.findViewById(R.id.textView_station);
			holder.stationState = (ImageView) convertView
					.findViewById(R.id.imageView_station_state);
			convertView.setTag(holder);
		} else {
			holder = (Holder) convertView.getTag();
		}
		//應對快取機制,初始化資料。
		holder.stationState.setImageResource(R.drawable.presence_offline);
		holder.station.setText(bean.getBusList().get(position));
		
		if (bean.getBusList().get(position).equals(bean.getCurrentPosition())) {
			String text = bean.isDirection() ? "當前位置" : "目標位置";
			holder.stationState.setImageResource(R.drawable.presence_now);
		}
		
			String station;
			int index2 = bean.getBusList().get(position).indexOf("(");
			if (index2 != -1) {
				station = bean.getBusList().get(position).substring(0, index2);
			} else {
				station = bean.getBusList().get(position);
			}
			if (bean.getStationList().contains(station)) {
				if (bean.getStateList().get(index).equals("前往")) {
				holder.stationState.setImageResource(R.drawable.presence_online);
			}
		}
		return convertView;
	}

	

相關推薦

解決ListView 快取機制帶來顯示正常問題

ListView載入資料原理:系統繪製ListView時,首先會用getCount()函式得到要繪製的這個列表的長度,然後開始逐行繪製。然後呼叫getView()函式,在這個函式裡面首先獲得一個Vie

Android 解決ListView巢狀GridView、GridView顯示正常的方法

自定義View,繼承GridView,重寫onMeasure()方法,程式碼如下: public class MyGridView extends GridView { public MyGridView(Context context) {

解決jenkins下使用HTML Publisher插件後查看html報告顯示正常 以jmeter報告為例

com 顯示不全 rip lis support https ima 註意 jenkins jenkins 配置使用html publisher查看jmeter html報告時,發現顯示不全,很多東西顯示不了。 項目配置: 查看html報告異常(很多資源無法加載)

解決 jenkins 下使用 HTML Publisher 插件後查看 html 報告顯示正常

nbsp note property support css CA 方法 prope 系統管理 方法一: 我的網頁使用的是css和Js,所以顯示不全。解決方法如下:在jenkins系統管理中輸入以下腳本運行:System.setProperty("hudson.model.

Android ScrollView巢狀ExpandableListView顯示正常的問題的解決辦法

  關於ScrollView巢狀ExpandableListView導致ExpandableListView顯示不正常的問題解決方法有很多,在這裡介紹一種小編親自測試通過的方法。 1:不顯示chidview: 重寫ExpandableListView : public&n

Linux下,Java圖形介面程式中文顯示正常顯示為方格)問題解決

RedHat或其它Linux系統下中文顯示為方格,原因是JRE環境中中文字型設定異常。 1.首先找到JRE所在的目錄,如在RedHat Enterprise 6中的目錄為:/usr/lib/jvm/java-1.6.0/jre 2.將windows中文字型simsun.ttf或simsun.ttc拷

(圖文)SVN檔案/資料夾圖示顏色顯示問題解決辦法、SVN資料夾和檔案狀態圖示顯示正常

svn檢出的資料夾上沒有綠色的對號,或者紅色的感嘆號標識。仍然是windows預設的資料夾。 解決方法: 首先,用win+R鍵開啟 執行 視窗,裡面輸入regedit(登錄檔),確定進入 首先我們找到localmachine,點選進入,下面找到software,展開下面的節點 在sof

vi編輯器方向鍵和backspace鍵顯示正常解決辦法和ubuntu的root密碼

網上看了很多方法,最簡單粗暴的莫過於改vim的配置檔案。方法如下: 首先改配置檔案要先切換到root賬戶,而今天使用ubuntu時想起來自己並沒有建立root賬號,更不用說密碼了。 然後我們只需要輸入 sudo passwd root 然後按提示輸入賬戶密碼,設定ro

android listview巢狀時,顯示全和能滑動的解決

在listview巢狀listview的過程中,如果我們不寫一點特殊的操作的話,可能子listview會顯示不全,並且無法滑動,那麼應該怎麼解決呢 1.子listview繼承listview,然後重寫onmeasure方法,在裡面手動的去計算高度,然後傳給super方法,這

Scrollview巢狀listView資料顯示正常問題

ScrollView 巢狀listview 資料顯示不全的問題解決方案:    提供一種比較中意的解決方案,不需要自己去測量高度,省了很多事。具體方案如下: 定義一個自己的listView,重寫屢試不爽。如果即使重寫之後還不能顯示完全,在加上一句 scrollView.sc

Eclipse中專案的原始檔顯示正常解決方案(如何修改src原始檔)

如上圖,在某些情況下需要將src原始檔夾修改成src/main/java(例如:Maven就要求標準的目錄結構),修改方法如下: 1、進入到該目錄資料夾下,如下圖: 2、在src資料夾下新建資料夾“main”,再在剛剛新建的main資料夾下新建“java”資料夾,如下圖:(注意如果改專案

Win10圖示顯示正常解決辦法

當快取檔案出現問題時,就會引發系統圖標顯示不正常; 1、由於圖示快取檔案是隱藏檔案,我們需要在資源管理器中將設定改為“顯示所有檔案”。 2、同時按下快捷鍵 Win+R,在開啟的執行視窗中輸入 %localappdata%,回車。 3、在開啟的資料夾中,找到 Iconcache.db,將其刪除。

Linux作業系統下Wine中文顯示正常解決方案

首先wine自己的系統中必須有中文字型,我的Ubuntu系統中已經安裝了宋體,這也是Windows Vista之前的幾個版本的系統使用的中文字型,所以: cd ~/.wine/drive_c/windows/fonts ln -s /usr/share/fonts/t

python中文顯示正常解決方案

一.概要 在程式碼檔案中定義中文時,無法正常列印顯示。 import json tinyDict = {'name': "a阿三", 'as': "nan"} print tinyDict.ke

程式改動後,執行程式出現空指標異常,xml檔案(layout)顯示正常解決辦法

這個問題真令人無語…… 解決方法:重啟Eclipse…… 以後一定要記住,剛剛還好好的程式,出現各種莫名其妙的錯誤時,如果自己確定自己沒寫錯,首先看是不是程式設計軟體的問題,另外有時候模擬器也會出現各種問題,如果有資料寫入模擬器的記憶體或sd卡,記得先把這些資料清除再看看是

關於mstar TV晶片蘋果裝置Airplay投屏播放畫面豎屏窗體旋轉、窗體顯示正常解決方案

用下面命令從tv中讀出當前storage的比例設定值 1、cd /Database 2、sqlite3 user_setting.db 3、select enARCType from tbl_VideoSetting where InputSrcType=34; selec

Office2013 圖示顯示正常解決辦法

很多人安裝了WPS後解除安裝了再安裝office2013會出現圖示不正常的現象如下圖所示,很多人用檔案關聯的方法進行修改,但是並不能成功。也有很多人推薦把WPS重新安裝一遍,然後用WPS自帶的修復工具取消檔案的關聯,然後再用WPS自帶的解除安裝工具將其解除安裝。然而並沒有起到作用。修改登錄檔也不行。在此我

關於Win7網路小圖示顯示正常解決辦法

昨日搗騰了一下筆記本,後來突然發現Win7工作列通知區域的網路小圖示總是顯示為無線未連線的狀態(實際是用的有線,且能正常上網),後來網上查了一下,原因是開啟了系統服務——Routing and Remote Access(路由服務),將其禁用並重啟電腦後圖示就正常了!  

win7桌面圖示顯示正常解決

1、點選 開始 執行 輸入 cmd2、右鍵,選擇“貼上”以下程式碼:taskkill /im explorer.exe /f   cd /d %userprofile%\appdata\local  

opengl在高DPI螢幕下顯示正常解決方法.

#include <iostream> #include <gl/glew.h> #include <GLFW/glfw3.h> int width = 800; int height = 600; char *title = "GLFW