簡體   English   中英

Android:關閉listview的延遲加載

[英]Android: Turn off lazy loading of listview

在我的Android應用程序中,我有一個包含30行的列表視圖,每行包含幾個文本視圖,其中一個是可跨越的,有時包含大量格式化的文本和圖像。

這些圖像是從網絡上異步加載的:顯示占位符直到圖像被下載后由圖像替換。

不幸的是,當我滾動它們時會加載listview的行。 這使整個事情變得非常緩慢。 此外,每當我滾動行時,這些圖像會一次又一次地從Web加載。

如何關閉它,當我滾動它們時加載ListView行? 當我開始活動時,它們應該被加載一次,而不再被加載。

最誠摯的問候和感謝,Jan Oliver

當您執行延遲加載ListView時,是因為您想加快應用程序的速度。 關閉它不是最好的解決方案。 因此,您可以做的是實現一個基本的緩存系統,以避免一次又一次地下載和設置ImageView。

最簡單的方法是實現一個HashMap,其中URL作為鍵,位圖作為值。 像這樣的東西:

Map cache = new HashMap();
// then, on your lazy loader
Bitmap image = cache.get(urlOfTheImage);
if( image == null ){
    // download and decode the image as normal,
    // then assign the decoded bitmap to
    // the 'image' variable
    cache.put(image);
}
imageView.setImageBitmap(image);

如果這些圖像總是相同的,這意味着每次打開應用程序時都會下載相同的圖像,然后您最好將這些圖像保存在文件系統中並從那里使用它們。

另一方面,如果圖像傾向於改變,你可以實現一些有趣的東西:使用SoftReferences 這個視頻有一個解釋。 如果要從文件系統加載圖像,也可以使用此方法。

編輯

關於您的評論,我強烈建議您觀看我發布的視頻。 這是一個小時,但它確實值得努力。 使用適配器時,檢查convertView是否為null只是提高性能的一種簡單方法,盡管還有一些其他技術可以進一步改善您的應用程序。 此外,如果您在使用該技巧時遇到問題,那是因為您可能以錯誤的方式實現它。 請記住:即使您不重新誇大視圖,也必須設置每個子視圖的值,否則您將遇到一些問題。

如果可以,請從充滿“占位符圖像”的圖像陣列開始,然后在創建期間將圖像下載到陣列中觸發AsyncTask。 在行視圖構建期間,只需引用該數組。 這樣,如果它有新圖像,它將加載它,如果沒有它將獲得占位符。

如果你有很多數據,它會變得非常慢,對用戶來說是一個糟糕的經驗。

創建表示每行的對象列表。 創建一個加載器作為后台線程,在加載數據時更新對象。 列表視圖將從對象中提取數據。

(如果每行有數百行和大量數據,那不是一個好主意 - 在這種情況下,您應該只在當前活動行的幾行內加載數據並具有某種MRU緩存)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM