我正在寫一個列表的庫。列表中的對象需要按照客戶定義的方式進行排序。所以客戶端寫一些比較器(按名稱,價格等),並將它們傳遞給庫助手。我們需要將這些比較器放置到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. 如何把字符串中捆綁
- 4. 把symfony捆綁在哪些東西
- 5. 比較從捆綁到本地值的字符串
- 6. 如何在jUnit中比較捆綁和collectionassert?
- 7. 捆綁器問題
- 8. 比較比較器的utils
- 9. Docker和捆綁器問題
- 10. 重置捆綁器路徑?
- 11. 捆綁exec是否需要「捆綁器/設置」等效?
- 12. 爲什麼捆綁包不捆綁在一臺服務器上?
- 13. RubyMine捆綁包/捆綁器配置錯誤
- 14. 比較器/比較/比較器鏈接問題
- 15. RequireJS:要捆綁還是不捆綁
- 16. mvc4捆綁強類型捆綁
- 17. 使用MS捆綁的空捆綁
- 18. 捆綁與捆綁安裝相同嗎?
- 19. 捆綁和捆綁安裝的區別
- 20. 比較的車把塊幫手
- 21. 比較列,並把輸出附加列
- 22. 比較項目列表,並把等於
- 23. 如何比較車把中的值?
- 24. 如何讓捆綁器使用舊的捆綁器寶石版本?
- 25. Java - 比較器
- 26. Concepts-Lite迭代器比較比較
- 27. Java接口比較器靜態比較
- 28. 可比較和比較器接口
- 29. Java比較器和可比較
- 30. 定製.NET 4.5捆綁器/縮小器
爲什麼你需要序列化比較接口? –
定義一個擴展「Comparable」和「Parcelable」的接口。讓客戶端應用程序實現該接口。然後,你可以把對象放在'Bundle'中。這就是說,你可能會考慮使用其他方法(例如,保留的片段,客戶端子類的片段類)。 – CommonsWare
@CommonsWare>讓客戶端應用程序實現該接口。如果我們要求客戶端實現一些接口,那麼執行這樣的事情會不會更容易? public Comparator provideComparator(int indexOfSortMethod){return comparators.get(indexOfSortMethod);} – Tau