2011-10-30 57 views
2

我有一個listview,其中每個列表項可以包含1個或多個可點擊的圖像。點擊它們會啓動一個顯示圖像全屏版本的活動。OnClickListeners不一致觸發

對於每個ListItem中的每個圖像,以下代碼(稍微簡化)將在我的GetView()實現中設置OnClickListeners。這工作完美。

ImageView imageView = (ImageView)convertView.findViewById(R.id.image_res); 
imageView.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ActivityLauncher.startPhotoViewerActivity(mContext, item); 
    } 
}); 

但是,爲了提高性能,我決定在第一次構建它時將每個視圖存儲在內存中。我這樣做,而不是使用convertView,因爲有4-5種不同類型的視圖,它們有時在代碼中動態構建,因此難以重複使用。

只要我開始將視圖存儲在內存中,然後在根據位置對getView()進行後續調用期間返回已構建的視圖,則性能顯着提高,但開始表現得很時髦。

具體來說,現在當一個給定的圖像被點擊時,它的OnClickListener可能會立即啓動或根本不啓動。在不立即觸發的情況下,只要開始滾動,就會觸發。如果這不會觸發OnClickListener運行,則返回(退出活動)可能會觸發它。如果這沒有觸發它,然後按BACK鍵關閉所有活動),然後重新進入應用程序將觸發所有排隊的OnClickListeners。在一個案例中,我在各種圖像上單擊了25次而沒有任何結果。然後我關閉了所有活動,然後再次單擊應用程序圖標,打開所有25個圖像預覽。

任何想法是什麼造成這種情況?我感興趣的是,OnClickListeners顯然設置正確,因爲他們在某個時間點打開照片查看器活動。從來沒有打開錯誤的圖像,永遠不會有火災發生的情況。問題是他們可能會立即或稍後開火。

是不是建議保存每個列表項的視圖並根據getView()內的位置返回它們,就像我正在做的那樣?任何幫助是極大的讚賞。

+1

您應該發佈整個'getView()'方法,否則將很難診斷爲什麼會發生這種特定行爲。 – dmon

回答

3

觀看Google I/O上給出的ListView的演講。 13:45,他們特別警告不要緩存意見並返回。如果有人這樣做,它可能會導致奇怪的行爲,這正是我所經歷的。鑑於此,這個問題是沒有意義的。

http://www.youtube.com/watch?v=wDBM6wVEO70

希望這可以幫助別人,將來避免同樣的陷阱。不推薦緩存視圖!

相關問題