[英]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.