2016-07-06 33 views
0

我正在写一个列表的库。列表中的对象需要按照客户定义的方式进行排序。所以客户端写一些比较器(按名称,价格等),并将它们传递给库助手。我们需要将这些比较器放置到HashMap<Integer, Comparator>,以便将此地图输入Bundle,并将其传递到Fragment。而我在这里面临的麻烦是比较器不是可序列化的,所以我看到运行时异常((把比较器捆绑

+1

为什么你需要序列化比较接口? –

+1

定义一个扩展“Comparable”和“Parcelable”的接口。让客户端应用程序实现该接口。然后,你可以把对象放在'Bundle'中。这就是说,你可能会考虑使用其他方法(例如,保留的片段,客户端子类的片段类)。 – CommonsWare

+0

@CommonsWare>让客户端应用程序实现该接口。如果我们要求客户端实现一些接口,那么执行这样的事情会不会更容易? public Comparator provideComparator(int indexOfSortMethod){return comparators.get(indexOfSortMethod);} – Tau

回答

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”,它与此特定问题没有直接关系,但可能有用;它涉及到在销毁活动/片段之前正确地将滚动设置为它所具有的值。

+0

您是否在谈论创建一些仅用于parcelling数据的合成类?您能否提供示例代码以澄清事情。 – Tau

+0

当然,让我找到一个我想解释的观点的例子,我希望它有帮助;) – Luis