2016-08-16 101 views
1

這裏是我的代碼 -是什麼holder.getAdapterPosition(之間)的位置屬性在onBindViewHolder(差異和構造函數)

public void onBindViewHolder(myViewHolder holder, int position) { 

     //1. details obj = list.get(holder.getAdapterPosition()); 
     //2. details obj = list.get(position); 

     holder.position = position; 
    } 

我得到一個警告

爲固定

不要把位置;只能立即使用並致電 holder.getAdapterPosition()稍後查看RecyclerView不會 當項目的位置在 數據集更改時再次調用onBindViewHolder,除非項目本身無效或無法確定新位置 。出於這個原因,您應該只在使用 方法獲取相關數據項時使用位置參數 ,並且不應保留其副本。如果您稍後需要 某個項目的位置(例如,在點擊偵聽器中),請使用getAdapterPosition() ,稍後將更新適配器位置。

所以我很困惑從1和2哪個我應該喜歡,爲什麼?正如它所說的getAdapterPosition()給出了更新的位置,我從基於位置的列表中獲取值。

謝謝。

回答

3

您收到的警告不是關於使用positiongetAdapterPosition()。它是關於保存位置:

holder.position = position; 

你並不需要保存的位置在你的持有人,因爲它的位置可以改變,你可以隨時通過調用holder.getAdapterPosition()獲得其位置;

從文檔:

注意與ListView控件,RecyclerView不會再如果在數據集中的項目變化,除非 項目本身是無效的或位置的新位置不能調用此方法 被確定。 由於這個原因,您應該只使用位置參數,而 獲取此方法內的相關數據項,並且不應保留 它的副本。如果您稍後需要某個項目的位置(例如,在 點擊偵聽器中),請使用getAdapterPosition(),該適配器將具有更新的 適配器位置。

關於其使用方法:

兩者都應返回相同的結果,如果叫onBindViewHolder方法內。我會建議使用position,因爲它是最簡單和最安全的。