把比较器放到捆绑

时间:2016-07-06 17:50:25

标签: java android

我正在为列表编写lib。列表中的对象需要以客户端定义的方式排序。因此,客户端会编写许多比较器(按名称,按价格等)并将它们传递给库助手。我们需要将这些比较符放到HashMap<Integer, Comparator>,以便将此地图放到Bundle,并传递给Fragment。我面临的问题是Comparator不是Serializeable所以我看到运行时异常((

1 个答案:

答案 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;这与这个特定问题没有直接关系,但可能有用;它与将滚动条正确设置为在销毁活动/片段之前的值有关。