2014-12-08 34 views
3

的預加載的行我在我的申請一個Android ListView和我在每行中顯示不同圖像(每行1個圖像,未定義的高度)的圖像使用的AsyncTask從web載,否則它將它從緩存中拉出來,這樣就很好。的Android ListView的數據

過程是,我有一個網址的形象,在我的適配器的每個getView(除非在高速緩存中找到),我火了一個異步任務來設置我的ImageView與圖像。我給它一個定義的寬度,以適應屏幕(然後我使用這個定義的寬度來縮放高度,所以我知道寬度但是不知道在下載和設置它之前的高度(或圖像的高寬比))

向下滾動時,一切正常,因爲列表視圖預加載像5行..它觸發5個電話下載我的代碼中的圖像。這使得滾動平滑。 問題是當我滾動。當我向上滾動時,視圖被重用,我知道寬度可以,但最初的高度爲0,直到我完全加載圖像;當它完全加載後,圖像視圖會擴展到任何高度(即1024),並且會使滾動不連貫,因爲它將視圖從0擴展到1024,並使焦點回到該視圖的頂部...

問題:是否可以設置列表視圖預加載向下滾動和達到一定的大小..?所以當向上滾動時,我的ListView有5行準備顯示。我知道這是可能的android.support.v4.view.ViewPager(默認情況下它的預加載+1和-1..but可以改爲+5和-5)

+0

你用什麼作爲適配器?在它內部,你使用bindView嗎? – 2014-12-08 00:42:49

+0

我使用的BaseAdapter ..只是使用getView,膨脹我的佈局之一,設置視圖任何我想要的並返回它。 – vankizer 2014-12-08 00:44:40

+0

我有一種解決方案..當我下載一個新的圖像,我記錄的高度,並把它放在HashMap,所以後來,檢查是否它的緩存圖像,如果是,我知道它的高度,所以設置圖像視圖對象寬度和高度,它不會跳躍..但這可能是在他們的生命週期中重新創建碎片/活動很麻煩...不知道如何通過周圍。 – vankizer 2014-12-08 00:47:32

回答

0

我認爲你應該重寫據我所知,在你的適配器中,代替getView,它代表BaseAdapter。不要忘記撥打super.newView

原因是爲了避免在向上滾動時綁定視圖(行)。方法newView被調用一次,每行只調用一次。並且getView也綁定視圖,這會使圖像再次加載,同時向後滾動。如果我沒有記錯的話,我認爲這是一個問題。

當然,這纔有意義,如果圖像不改變,當您載入他們。如果圖像應該動態變化,而上下滾動,我想你會卡住,但我懷疑是這樣。我假設你不會保存舊的/丟棄的圖像的高度。

+0

另外,您可以在AsyncTask中將高度作爲數據加載,即服務器中的一個數字。它必須快得多。 – 2014-12-08 01:01:04

+0

對,他們不這樣做,我按特定順序提取一組URL並顯示它們,有時在刷新時可能會更改順序,但這就是爲什麼我將URL哈希到高度而不是高度。 – vankizer 2014-12-08 01:04:44

+0

我看過newView方法..它沒有位置?我正在使用那個和arraylists訪問我的所有數據..我沒有使用任何東西,但getView,所以我可能會丟失一些東西 – vankizer 2014-12-08 01:05:36