我正在寫一個列表的庫。列表中的對象需要按照客戶定義的方式進行排序。所以客戶端寫一些比較器(按名稱,價格等),並將它們傳遞給庫助手。我們需要將這些比較器放置到HashMap<Integer, Comparator>
,以便將此地圖輸入Bundle
,並將其傳遞到Fragment
。而我在這裏面臨的麻煩是比較器不是可序列化的,所以我看到運行時異常((把比較器捆綁
Q
把比較器捆綁
0
A
回答
0
)我前一段時間面臨同樣的問題(按價格,按接近度,按名稱排序)通過在包中保存項目列表(項目必須是實現IParcelable的某個類的實例)和排序參數(如果有的話)。然後,在恢復Bundle時,我得到了項目的parcelableArray以及排序方法,在活動/片段適當設定值。
注意,這樣你恢復在同一順序的項目列表,因爲他們保存的,所以一切都按預期工作。
恕我直言日通過捆綁一個比較器來完成你想要完成的任務。
UPDATE:實施例:
1.-的模型實現IParcelable:
public class Parking implements Parcelable {
...
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(mId);
parcel.writeString(mCode);
...
}
public static final Parcelable.Creator<Parking> CREATOR
= new Parcelable.Creator<Parking>() {
public Parking createFromParcel(Parcel in) {
return new Parking(in);
}
public Parking[] newArray(int size) {
return new Parking[size];
}
};
}
2.-在片段/活性,我使用模型的ArrayList實現IParcelable和過濾器施加:
private ArrayList<Parking> mParkings;
private ParkingsFilter mFilter;
3.-當保存/恢復,我想借此項考慮:
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putParcelableArrayList(PARKING_LIST, mFragment.getParkings());
savedInstanceState.putInt(CURRENT_FIRST_PARKING, mFragment.getCurrentFirstVisibleParking());
savedInstanceState.putString(CURRENT_SEARCH_QUERY, mFilter.getCurrentQuery());
...
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
ArrayList<Parking> parkings = savedInstanceState.getParcelableArrayList(PARKING_LIST);
mFragment.setParkings(parkings);
int currentFirstVisibleItem = savedInstanceState.getInt(CURRENT_FIRST_PARKING);
mFragment.setCurrentFirstVisibleParking(currentFirstVisibleItem);
mFilter.setCurrentQuery(savedInstanceState.getString(CURRENT_SEARCH_QUERY));
...
}
因此,我保存整個列表,並按照保存的順序恢復;另一方面,我恢復應用的排序選項以在恢復捆綁時正確設置值。
這裏的關鍵是.getParcelableArrayList(),.putParcelableArrayList()調用。過濾器可以保存爲一個枚舉或簡單的整數/字符串...你會。
此外,我在示例中包含「currentFirstVisibleItem」,它與此特定問題沒有直接關係,但可能有用;它涉及到在銷燬活動/片段之前正確地將滾動設置爲它所具有的值。
相關問題
- 1. 捆綁-ManifestVersion = 2對比捆綁-ManifestVersion = 1
- 2. 如何把字符串中捆綁
- 3. 把symfony捆綁在哪些東西
- 4. 捆綁器問題
- 5. 重置捆綁器路徑?
- 6. 捆綁與捆綁安裝相同嗎?
- 7. 比較的車把塊幫手
- 8. 如何讓捆綁器使用舊的捆綁器寶石版本?
- 9. 可比較和比較器接口
- 10. Android和捆綁
- 11. 使用捆綁
- 12. overrid FOS捆綁
- 13. 捆綁和putExtra
- 14. Vue.js被捆綁
- 15. 捆綁在proup
- 16. 的Javascript捆綁
- 17. 捆綁不mongo_ext
- 18. 無法捆綁
- 19. Laravel前捆綁
- 20. 捆綁CSS CDN
- 21. 捆綁pathsForResourcesOfType:inDirectory:
- 22. 我應該把文件夾。捆綁在版本控制
- 23. 如何把ArrayList的成捆
- 24. 如何計算比較器/可比較器中的比較次數?
- 25. LinkedHashMap的比較器
- 26. 行內比較器
- 27. 指定比較器
- 28. 比較器實現
- 29. 結構比較器
- 30. 約束比較器
爲什麼你需要序列化比較接口? –
定義一個擴展「Comparable」和「Parcelable」的接口。讓客戶端應用程序實現該接口。然後,你可以把對象放在'Bundle'中。這就是說,你可能會考慮使用其他方法(例如,保留的片段,客戶端子類的片段類)。 – CommonsWare
@CommonsWare>讓客戶端應用程序實現該接口。如果我們要求客戶端實現一些接口,那麼執行這樣的事情會不會更容易? public Comparator provideComparator(int indexOfSortMethod){return comparators.get(indexOfSortMethod);} – Tau