解决ListView 缓存机制带来的显示不正常问题
生活随笔
收集整理的這篇文章主要介紹了
解决ListView 缓存机制带来的显示不正常问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ListView加載數據原理:系統繪制ListView時,首先會用getCount()函數得到要繪制的這個列表的長度,然后開始逐行繪制。然后調用getView()函數,在這個函數里面首先獲得一個View(簡單item,如字符串或者單個組件的顯示則是View,自定義的item,包含很多控件的時候是一個ViewGroup),然后再實例化并設置各個組件及其數據內容并顯示它。如果我們有大量的item要顯示怎么辦?不可能為每個Item創建一個新的View,這會消耗大量的內存,可能會OOM!解決辦法就是緩存View然后重復利用。這個圖是解釋了系統緩存的過程,當有前面的Item已經劃出屏幕時,它的View將被后面的Item復用。
顯示不正常問題:緩存機制固然很好,但在使用時要特別注意。比如,前面的Item里面的組件的數據也會被帶到將要復用的Item中,從而導致顯示錯誤。
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubHolder 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中的組件數據再初始化為原來的狀態就行了。
?
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubHolder 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;}?
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
?
轉載于:https://www.cnblogs.com/AndyDai/p/4734099.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的解决ListView 缓存机制带来的显示不正常问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金庸群侠传苍龙逐日1.2-szlzw手机
- 下一篇: web功底之强,实属罕见。。