這裏還是一個相當新的Android開發人員。快速滾動時getView調用錯誤位置
我遇到了一個奇怪的問題,我不知道如何解決。我在這裏看到很多問題,聽起來像是我遇到的同樣的問題,但是他們的問題的解決方案似乎從來不適用於這裏發生的事情。
我有一個自定義的listView設置使用一個單獨的類,擴展BaseAdapter和使用視圖持有人(我設置了這看起來各種不同的自定義列表視圖的例子)。它有一個文本視圖,一個按鈕,一個進度條和一個圖像按鈕,這些項目根據用於下載文件的AsyncTask進行隱藏/更改。
當我慢慢滾動列表時,一切正常。當我快速向上/向下滾動列表時,就好像列表中某些單元格的視圖重新分配給其他單元格一樣。
我把這個線在我的「getView」法頂在我的適配器類:
@Override
public View getView(final int pos, View convertView, ViewGroup parent)
{
Log.i("ks3","getView called, position is " + pos);
我在我的名單7個項目,其中6適合在屏幕上。當它第一次被顯示出來,我看到這個在我的日誌:
getView called, position is 0
getView called, position is 1
getView called, position is 2
getView called, position is 3
getView called, position is 4
getView called, position is 5
當我慢慢地向下滾動到下一個項目,這是打印出來下一個:
getView called, position is 6
當我向後滾動起來,這:
getView called, position is 0
往下走慢慢地產生這些結果完美無缺。
當我開始來回滾動很快,它打印出此消息一幫次,多出6和0的位置,但有時我會看到這些還有:
getView called, position is 1
getView called, position is 5
位置1和5不應該被調用,因爲它們總是在屏幕上。就好像getView弄得一團糟。同時,正如我之前所說的,我的列表看起來很奇怪。圖像按鈕將在不應該出現的單元格上移或下移。
如果我順利回去滾動,我再次只看到0和6的位置。
我真的不知道如何解決這個問題。我想也許我可以限制你能夠滾動列表的速度,但一直沒有找到任何可行的方法。
謝謝!
編輯: 我想更新關於這個問題的一些事情。第一個是,從這裏發表的評論以及來自listView上的Google視頻,我注意到getView可以被稱爲其他事物,然後是我想象的那樣,比如測量,所以我不應該感到驚慌通過我原本認爲是我的問題的一部分(那是因爲我認爲getView被錯誤的位置調用)。其次,我多次看到「緩存適配器內的視圖」是一個非常糟糕的主意。我不完全清楚這意味着什麼,但我敢肯定,這是我做錯的事情之一(我保存一個按鈕的實例,progressBar,imageButton ...)。
這,以及我更新getView外的視圖,並且我不使用notifyDataSetChanged();這些可能會導致一些不可思議的事情發生。
除非你的自定義ListView做了一些奇怪的事情,這聽起來像是一個回收問題,發佈完整的getView()代碼。 – dmon 2012-03-15 01:02:22
如果您在代碼中找不到任何錯誤,並且使用Honeycomb或更高版本,則可以嘗試爲列表佈局禁用硬件加速。硬件加速可能會導致此類錯誤。 – zapl 2012-03-15 16:37:21
它感覺像是一個回收問題。我要看看listViews上的Google視頻,看看我使用listView時是否有任何明顯的問題。 – Droidmon 2012-03-15 16:50:06