2016-07-15 40 views
4

我使用Parse對象ID創建了一個哈希碼,但顯然這有一些小的可能性。有沒有一些建議的方式來創建一個ParseObject的ID在RecyclerView中使用?

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    private List<MyParseObject> mObjects; 

    ... 

    @Override 
    public long getItemId(int position) { 
     return mObjects.get(position).getObjectId().hashCode(); 
    } 
} 
+0

你是如何在利用getItemId打電話規劃?如果這是你真正想要的,我會誠實地研究一個具有特定功能的接口來獲得解析ID。在理論上,hashCode碰撞應該很少,但是你是正確的,它可能會產生問題。 – zgc7009

+0

我以前做過,但我的主要建議是創建一個本地POJO並從中解析數據對象。可能看起來多餘,但稍後再感謝我。自從中間件發生變化以來,這只是一個很好的練習 – CQM

+1

每個ParseObject都有一個與其關聯的創建日期。使用以下代碼創建項目ID:long itemId = parseObject.getCreatedAt()。getTime()+ parseObject.getObjectId()。hashCode(); –

回答

4

不具體解析,但是你可以從對象ID很容易地創建穩定的IDS:

public class StableNumericalIdProvider { 
    private int idProvider; 
    private final Map<String, Integer> numericalIds = new HashMap<>(); 

    public int id(String stringId) { 
     Integer numericalId = numericalIds.get(stringId); 
     if (numericalId == null) { 
      numericalId = idProvider++; 
      numericalIds.put(stringId, numericalId); 
     } 
     return numericalId; 
    } 
} 

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    private List<MyParseObject> mObjects; 

    private StableNumericalIdProvider idProvider; 

    @Override 
    public long getItemId(int position) { 
     return idProvider.id(mObjects.get(position).getObjectId()); 
    } 
} 

(在一個側面說明,你需要實現getItemId如果數據集是不改變? ,你不必)

+0

我使用SwipeRefreshLayout,因此實現它可以防止閃爍 – tachyonflux

0

爲什麼你需要提供id?

嘗試在recyclerview(documentation)使用 setHasStableIds(true)和改變你的getItemId方法只返回位置:

public int getItemId(int position) { 
    return position; 
} 
相關問題