4

私はParseオブジェクトIDを使用してハッシュコードを作成していますが、明らかにこれは少し爆発する可能性があります。RecyclerViewで使用するためのParseObjectのIDを作成するための推奨される方法はありますか?

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コールを利用して計画されている方法は?私は正直なところ、あなたが本当に探しているものであれば、Parse IDを取得するための特定の関数を持つインターフェイスを調べます。理論的には、hashCodeの衝突は少なくてすむはずですが、問題が発生する可能性があります。 – zgc7009

+0

私はこれまでにやったことがありますが、私の主な勧告は、ローカルのPOJOを作成し、それからデータオブジェクトを解析することです。冗長に見えるかもしれませんが、後で私に感謝しますミドルウェアの変更以来の一般的な良い練習 – CQM

+1

すべてのParseObjectには、作成日が関連付けられています。それからアイテムIDを作成します。long itemId = parseObject.getCreatedAt()。getTime()+ parseObject.getObjectId()。hashCode(); –

答えて

4

ない解析するために具体的な、しかし、あなたは、オブジェクトIDから簡単に安定したIDを作成することができます。

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

なぜidsを提供する必要がありますか?

は(documentation)recyclerviewに setHasStableIds(true)を使用して試してみて、位置だけを返すために、あなたのgetItemId方法を変更します。

public int getItemId(int position) { 
    return position; 
} 
関連する問題