我正在为列表编写lib。列表中的对象需要以客户端定义的方式排序。因此,客户端会编写许多比较器(按名称,按价格等)并将它们传递给库助手。我们需要将这些比较符放到HashMap<Integer, Comparator>
,以便将此地图放到Bundle
,并传递给Fragment
。我面临的问题是Comparator不是Serializeable所以我看到运行时异常((
答案 0 :(得分:0)
前一段时间我遇到了同样的问题(按价格,按接近程度,按名称,按地址排序),并通过在项目列表中保存项目列表来解决它(项目必须是实现IParcelable的某些类的实例)和排序参数(如果有的话)。然后,当恢复Bundle时,我得到了parcelableArray项和排序方法,在activity / fragment中正确设置了值。
请注意,这样您可以按照保存的顺序恢复项目列表,因此一切都按预期工作。
恕我直言,通过捆绑比较器,你想要实现的目标要容易得多。
更新:示例:
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(),. outputParcelableArrayList()调用。过滤器可以保存为枚举或简单的整数/字符串......就像你一样。
此外,我在示例中包含了&#34; currentFirstVisibleItem&#34;这与这个特定问题没有直接关系,但可能有用;它与将滚动条正确设置为在销毁活动/片段之前的值有关。