簡體   English   中英

自己的實現的適配器構造函數不接受hashMap.values()

[英]Adapter constructor of own implementation is not accepting hashMap.values()

我從ArrayAdapter<>實現了自己的Adapter 在構造函數中,我使用的是HashMap,它獲取UUID作為鍵,並使用另一個隨機類,稱為Room 基本上,這是一個SmartHome應用,其中包含可攜帶設備(fyi)的房間。 但是, RoomAdapter的構造函數的RoomAdapter (位於https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView )使用的是super()-不采用HashMaps的方法。

public RoomAdapter(Context context, HashMap<UUID, Room> room) {
    super(context, R.layout.list_item_room, room.values());
}

我正處於Java的初級階段,所以我真的不知道我要尋找什么。 我嘗試將調用room.values()時收到的集合轉換為ArrayList,這是在嘗試使用HashMap之前使用的方法。

是否有一種簡便的方法可以僅在代碼中的此位置解決此問題,還是我必須更改代碼並為我的room使用ArrayList?

如果問題是您的超類的構造函數沒有將類型化的Collection實例( Collection<Type> )作為參數,而是將類型化的List實例( List<Type> )作為參數,則可以執行以下操作:

public RoomAdapter(Context context, HashMap<UUID, Room> room) {
    super(context, R.layout.list_item_room, new ArrayList<>(room.values()));
}

在這里,我要做的就是實例化一個新的ArrayList內聯並將其作為參數傳遞給超類的構造函數。 ArrayList的構造函數之一接受類型化的Collection ,這是您在調用room.values()

原因是HashMap#values()不返回ArrayList 它返回一個Collection<T>對象,該對象包含Map中的所有值。 ArrayList<T>Collection<T> ,但Collection<T>不一定是ArrayList<T>因此您的適配器不知道如何處理Collection。 它可以是ArrayList ,可以是HashSet ,可以是Vector ,可以是LinkedBlockingQueue或從Collection擴展的任意數量的對象。 實際上,它可能是僅HashMap知道的自定義實現。 關鍵是,底層集合是什么都沒有關系,並且HashMap對其返回的內容不做任何保證,因此這就是您要使用的接口。

您可以通過將值復制到ArrayList中來修復代碼,如下所示:

super(context, R.layout.list_item_room, new ArrayList(room.values()));

但是,因為它是HashMap, 所以不能保證您放置項目的順序將與您收到項目的順序相同
但是值將按照HashMap決定將其放入的任意順序排列。

更可預測的HashMap實現是LinkedHashMap ,它可以滿足您的目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM