我正在写一个列表的库。列表中的对象需要按照客户定义的方式进行排序。所以客户端写一些比较器(按名称,价格等),并将它们传递给库助手。我们需要将这些比较器放置到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