2012-03-30 24 views
4

我有一個ListView自定義Adapter。說實話,我有很多在同一時間在屏幕上,我的Tegra 3設備開始滯後,是什麼讓我非常困惑...我發現比每個ListViewAdaptergetView()方法被稱爲所有可見行時間任意動畫在屏幕上運行。這讓我喜歡每秒幾百個電話!挖掘更多,這些電話大部分是由於ListView s父母的電話measure()onMeasure(),並且 - 這是關鍵 - 它們是無用的,因爲我的所有佈局具有const大小。ListView getView()過於頻繁地被調用

所以我的問題是:如何消除這些電話?當然,我想單獨留下正確的電話(由於將項目添加到AdapternotifyDataSetChanged())。

我已經嘗試了幾乎任何東西,但是無論是整個列表都沒有繪製自己(當我重寫它的onMeasure()並強制返回const大小而不調用super.onMeasure())或停止更新。

回答

3

如何實現getView()方法?如果你以正確的方式實施它,應該幾乎沒有滯後。

退房這真的真的好視頻:

正如羅曼說,它不反對它的工作。最好的做法是單獨測量(),並專注於適配器。

+0

感謝您的鏈接,我會看,但我不認爲我可以以任何方式優化我的getView()方法。:/ – 2012-03-30 10:50:43

+0

還沒有找到一個好的解決方案,但給我最多的東西是在你的鏈接中的一部電影 - 所以我將這標記爲答案。 – 2012-08-03 14:55:02

+0

謝謝,該視頻非常有用(加速getView真的很好的提示)。我冒昧地修復了鏈接(已被打破)並添加了幻燈片的鏈接(對於那些不想看整整一小時的人)。 – Heinzi 2012-08-23 14:59:53

3

那如何的ListView實現。我不認爲這會導致性能開銷..只要你做的事情有正確..

例如..

不要實例化LayoutInflator內GetView方法,就做在一流水平..

和膨脹視圖只有當convertView==null否則只返回convertView ..充氣的觀點是一個昂貴的過程....

+0

好吧,現在我在應用程序級別執行此操作,但這並沒有給我帶來任何好處,唉。當然,我會回收看法,儘可能避免膨脹。 – 2012-03-30 10:38:37

+0

@FenixVoltres ..你有沒有遇到一個問題..?或者你只是試圖避免多個問題,.. – ngesh 2012-03-30 10:45:08

+0

問題是我在我的活動中由於大量的measure()和onMeasure()調用而導致滯後(在最新的設備之一上!)內部適配器中的視圖被稱爲(如我所見)。 – 2012-03-30 10:49:29

2

造成這種情況的根本原因是ListView.onMeasure()調用AbsListView.obtainView(),它將請求列表適配器的視圖。所以如果你的觀點正在通過動畫重新測量,你的表現將會很差。

2

那麼就像你說的這些調用ListViews父母因measure()onMeasure()電話,我敢肯定,你正在使用height=wrap_contentwrap_content身高您ListView如果你的身高已經改變將檢查沒有停止。

因此,解決辦法是height=fill_parent。 我希望這對你有所幫助。

+0

該死的,那太對了!非常感謝。我有'wrap_content',並有同樣的問題。你救了我。 – 2015-09-23 15:47:39