2017-01-09 44 views
2

我有一個ListView,它具有相當高和複雜的項目,但沒有太多極端。每個項目是一個CardView與不同數量的行。使用複雜項目優化ListView性能

不幸的是,使滾動完全平滑似乎相當困難。

即使適配器的getView()方法除了返回已回收視圖之外幾乎沒有任何功能,但仍有16ms以上的幀。

慢幀的繪製時間比其他幀(如8ms)慢得多,因爲當用戶滾動到它時(我認爲)該項目無效並繪製到緩存。

我試圖設置scrolling_cachefalse,沒有幫助。使用RecyclerView也未改善性能。

+0

你爲什麼不試試'RecyclerView' –

+0

我會盡快更新這篇文章。 – fhucho

+0

@NJ沒有幫助 – fhucho

回答

0

首先ListView不應該有一個複雜的佈局。如果ListView項目可以擴展或類似的東西,還有其他方法可以做到這一點。你可以考慮使用ExpandableListView來達到這個目的。

但無論如何,由於您的列表項是一個複雜的項目,因此我早先經歷了類似的情況,並且必須儘可能簡化列表項目佈局。我用RelativeLayout替換了我所有的LinearLayout,這樣它就減少了View層次結構。

如果您的列表項(即CardView)包含任何圖像,您可能已經考慮使用Glide或Picasso加載圖像。

我曾經使用過的另一個技巧是使用onScrollListener來檢測ListView中的投影滾動以獲取複雜的列表項。

@Override 
public void onScrollStateChanged(AbsListView absListView, int scrollState) { 
    if(scrollState != SCROLL_STATE_FLING) { 
     // Populate views here 
    } 
} 

避免任何數據庫調用或getView函數中的循環。你可能已經考慮過了。我只是把我的想法完全放在一邊。