2016-07-06 30 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