2012-01-09 36 views
0

我對我的ListView有一個直接的BaseAdapter。它下載一個JSON提要並在行中顯示數據。有一個ViewHolder,它包含視圖和一個名爲「Story」的數據對象。一切正常。ListView適配器在convertView被回收時會感到困惑

但是,在滾動更長的列表後,我注意到兩件事。

1)我的日誌顯示適配器在進一步向下滾動時正在重新加載饋送。這很奇怪,因爲我把整個JSON數組放入一個變量中,爲什麼它必須重新加載?

2)更重要的是,在來回滾動後,行中包含錯誤的「Story」對象。以下是getView例程的相關部分:

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    Story story = stories.get(position); 
    if (convertView == null) { 
     //create holder 
     holder = new ViewHolder(); 
     convertView = inflator.inflate(R.layout.story_list_item, parent, false); 
     holder.titleView = (TextView) convertView.findViewById(R.id.story_list_title); 
     holder.dateView = (TextView) convertView.findViewById(R.id.story_list_date); 
     holder.story = story; 
     holder.imageView = (ImageView) convertView.findViewById(R.id.story_list_image); 
     convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     }  
    // configure the view  
    holder.titleView.setText(story.title); 
    return convertView; 
} 

夠簡單。現在奇怪的是,我可以通過消除if語句if (convertView == null)(以及我認爲也消除了行回收)來解決問題

但我會不會遇到內存問題這種方式?爲什麼簡單的香草版本不起作用?

感謝您的幫助。 問候, 小號

+0

我沒有看到JSON訂閱源的下載位置,但是當您滾動速度足夠快時,視圖將在其第一個訂閱源完成下載之前得到回收。然後,第二個Feed的下載將開始,如果第一個下載完成,則它可以在某種意義上被「覆蓋」。這裏有一篇關於如何在listview中下載和顯示圖像的博客文章:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – danh32 2012-01-09 14:22:06

+0

謝謝我一定會追求。 – Mundi 2012-01-09 14:27:32

回答

1

你都知道,你只分配

holder.story = story 

convertView == null?考慮將holder.story = story移至convertView之後,如果情況更好,它應該會更好。順便說一句,你甚至需要將「故事」存儲在你的視圖持有者中嗎?通常,該模式只能用於存儲視圖和視圖狀態信息,而不能用於實際位置的數據。

+0

就是這樣,謝謝。但是**你實際上是如何傳輸數據的?就像各種文字視圖中的文字一樣?如何通過不同的視圖加載圖片網址,您會在那裏放置該圖片?再次感謝。 – Mundi 2012-01-09 14:26:23

+0

在活動之間傳遞?如果你使用的是ContentProvider,你通常會傳遞一個Uri作爲點擊的項目,對於JSON,我會在Intent extras中發送相關信息(在你的情況下,將從「stories」數組中填充這些信息)。爲Story實現Parcelable,或者只是將它寫入額外的'Bundle'並將其發送給Intent? – Jens 2012-01-09 14:32:55

+0

這就是我正在做的 - 在Extras包中發送數據。但是我發現Parcelable是一個真正的痛苦和充滿錯誤 - 從來沒有讓它正常工作。所以我使用很多代碼行來發送我的故事的每個屬性......來自iOS,這真的很尷尬。 – Mundi 2012-01-09 18:13:36