2017-02-24 55 views
1

我用250個項目填充我的RecyclerView。 每個視圖只有4個TextViews。在爲RecyclerView創建適配器時,onCreateViewHolder需要約5 ms,onBindViewHolder需要約3 ms。對於250件物品,我們會延遲2秒。在這兩秒鐘內UI會凍結,因爲適配器分配必須在主線程上執行。RecyclerView在onCreateViewHolder和onBindViewHolder中安裝時需要很多時間:進度條凍結

例如在onCreateViewHolder沒有太多事情佈局通脹的旁邊:

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    long lTime = System.currentTimeMillis(); 
    switch (viewType) { 
     case TYPE_HEADER: 
      SpendingHeader lResult = new SpendingHeader(LayoutInflater.from(mContext).inflate(R.layout.layout_spending_item_header, null)); 
      LogUtils.logTime(lTime, TAG, "onCreateViewHolder"); 
      return lResult; 
     default: 
      SpendingItem lResult2 = new SpendingItem(LayoutInflater.from(mContext).inflate(R.layout.layout_spending_item, null)); 
      LogUtils.logTime(lTime, TAG, "onCreateViewHolder"); 
      return lResult2; 
    } 
} 

完整計算的東西是在在的AsyncTask後臺線程中完成的。只有onCerateViewHolder和onBindViewHolder需要花費很多時間,以阻止進度條凍結。我可以等待,但進度條凍結並不好。有沒有辦法繞過這個?另外我不想要一個懶惰的列表,例如在滾動到第30個項目之後獲得進度條。

注意:我的Recyclerview也必須是NestedScrollView for actionbarBar ControllableLayout行爲的一部分。可能這是一個問題?見here

+1

看起來問題是NestedScrollView。通常onCreateViewHolder和onBindViewHolder不會立即調用250次(除非它們全部適合屏幕)。通常onBindViewHolder僅在新視圖進入屏幕時調用。 –

+0

Recyclerview已經實現了'NestedScrollingChild',所以你很可能不需要將它放在NestedScrolling Layout中以獲得AppbarLayout行爲。 – Kuffs

回答

1

你並不需要包裝RecyclerViewNestedScrollView。即使沒有它,它也會正確地與AppBarLayout行爲。

您滯後的原因是RecyclerView適配器創建ViewHolders並結合(在你的案件250),它擁有所有的項目,這是因爲NestedScrollView使RecyclerView措施本身以錯誤的方式(以匹配NestedScrollView大小),在這種情況下RecyclerView「認爲」它需要創建足夠的ViewHolders來適應這個錯誤的大小。

您也可以嘗試撥打setAutoMeasureEnabled(true)使其正確測量自身。

+0

是的,我發現這就是原因。如果你想要在一個很長的RecyclerView中使用這個AppBarLayout - 你已經完成了;) – softwaresupply

相關問題