2017-08-01 30 views
2

在回收視圖中,主要有3種類型的單元。我已經實現了,通過下面的一段代碼Recycler視圖中的性能問題,同時呈現各種類型的單元

final int TYPE_COMMENT = 10004; 
final int TYPE_UPDATE = 10005; 
final int TYPE_ACTIVITY = 10006; 
public int getItemViewType(int position) { 
    if(activity.getActivity().getType().equalsIgnoreCase(CHECKIN_COMMENT_STRING)){ 
     return TYPE_COMMENT; 
    }else if(activity.getActivity().getType().equalsIgnoreCase(CHECKIN_UPDATE_STRIND)){ 
     return TYPE_UPDATE; 
    }else if(activity.getActivity().getType().equalsIgnoreCase(CHECKIN_HISTORY_STRING)){ 
     return TYPE_ACTIVITY; 
    } 
    return TYPE_ACTIVITY; 
} 

然後當我膨脹的第二one.It與主要5份複雜的佈局問題就來了。每個單元格都有機會與這5個部分中的一個或其組合(具有LinearLayout根,後面跟着一些複雜的小部件)。所以我做了研究,發現我們可以通過以下方式克服它。

  1. 通過使用visibility(View.GONE),我可以隱藏/顯示所需的部分。
  2. 定義視圖存根中的每個零件並在需要時對其進行充氣。
  3. 編程方式添加小部件所需的零件(但我不建議這樣,因爲意見是比較複雜)
  4. 定義單獨的電池零件的每個組合,但可能需要5!細胞設計多達120個細胞。所以不可能

    你可以請建議哪個更好的方法來做(或建議替代),而性能是我的關鍵約束。

Image of 2nd type of cell

+0

而不是在可視性上玩,嘗試multple ViewHolder? – akhilesh0707

+0

已經使用多個viewholder來呈現主要3種類型的單元格。但是第二種類型需要進一步分類。由於它有120個變體(描述的第4點),它很難創造那麼多觀看者......我是對的嗎? –

+0

管理多個視圖持有者可能很容易,而不是管理可見性,在可見性情況下,您的代碼將更加複雜。 – akhilesh0707

回答

1

如果業績是目標和那些複雜的佈局的數量不是很高的話,我建議你不要再利用複雜的看法,這是分配不同的ViewType爲每一個然後填充onCreateViewHolder中的所有值,而不是onBindViewHolder中。滾動會更平滑。

小費:

我用這個系統在複雜的清單,包含許多小工具,textviews,editboxes,搜索欄和其他它工作得很好,但有時會出現異常onCreateViewHolder是爲同一ViewType叫了兩聲佈局,導致用戶輸入的數據丟失。我最終使用已創建的ViewHolder與viewType Map<Integer, MyViewHolder> holderMap = new HashMap<>(); 和onCreateViewHolder的Map來解決它,如果它存在,我將返回previuos持有者。

希望它會幫助

+0

我們可以使用viewstub呈現複雜的佈局部分嗎?......它是否克服了性能問題 –

+0

每個單元格的數據將不同,那麼如何在onCreateViewHolder而不是onBindViewHolder上填充數據? –

+1

只需在onCreateViewHolder返回之前填充數據,對於不同的行有不同的數據沒有問題,您將爲每個行擁有獨立的持有者,而只有一個持有者,每次滾動onBindViewHolder時數據將被填充,這會減慢很多。 –