We talked about this on Redditとなります。解決策は、フィールドposition
を明示的に追加し、新しい要素が追加されるたびに自動的に更新されるfindAllSorted(MyObjFields.POSITION)
を使用することです。
小さなデータセットの場合は、アダプタのデータセットを実際に並べ替えるには、結果リストのアンマネージコピーを作成し、並べ替えてからバックグラウンドスレッドに保存することをおすすめします。
List<Obj> unmanagedList = realm.copyFromRealm(results);
//...
realm.executeTransactionAsync(new Realm.Transaction() {
public void execute(Realm realm) {
for(int i = 0; i < unmanagedList.size(); i++) {
Obj obj = unmanagedList.get(i);
Obj managedObj = realm.where(Obj.class).equalTo(ObjFields.ID, obj.getId()).findFirst();
if(managedObj != null) {
managedObj.setPosition(i);
}
}
}
});
だけエッジケースは、新しい要素が追加されている場合は、管理対象外リストが自動更新をしないということです。これを明示的に処理する必要がある場合は、RealmChangeListener<RealmResults<Obj>>
をフィールド変数として格納された結果セットに使用できます。
なぜあなたはそれを望みますか? –
私はRecyclerView.AdapterのデータプロバイダとしてRealmResultsを直接使用したいと思っていました。ドラッグ&ドロップ機能を備えたグリッドビューを構築しているので、オブジェクトを再編成して位置を保存する簡単な方法が必要です。しかし、オブジェクト内のカスタムフィールドで手動で行うことは悪夢です。通常のインデックスのリストのように振る舞うことはできません。私はSQLiteとカーソルで試しましたが、それを処理する多くのクラスではさらに悪化しました。 –
*オブジェクトのカスタムフィールドで手動で行うことは悪夢です*なぜですか?実際には良いアイデアのように聞こえます。それ以降も永続化されます。リスト内の一部のインデックスを変更するだけで、次回にアプリケーションを起動すると再びインデックスが異なる –