我从Adapter
实施了自己的ArrayAdapter<>
。在构造函数中,我使用的是一个HashMap,它将 UUID 作为键,另一个名为 Room 的随机类。基本上,它是一个SmartHome应用程序,具有携带设备(fyi)的房间。但是,RoomAdapter
(在https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView处找到)的构造函数的实现是使用super() - Method,它不使用HashMaps。
代码
public RoomAdapter(Context context, HashMap<UUID, Room> room) {
super(context, R.layout.list_item_room, room.values());
}
我在Java的初学者阶段,所以我不知道自己要找什么。我尝试将我调用room.values()
时收到的集合转换为我尝试使用HashMap之前使用的ArrayList。
有没有一种不错的方法可以在代码中的这个位置修复此问题,还是我必须更改我的代码并为我的room
使用ArrayList?
答案 0 :(得分:0)
如果问题是您的超类的构造函数没有将类型为Collection
的实例(Collection<Type>
)作为参数,而是采用类型List
实例({{1} }),你可以做类似的事情:
List<Type>
这里,我所做的就是实例化一个新的ArrayList内联并将其作为参数传递给超类的构造函数。 ArrayList的一个构造函数接受一个类型public RoomAdapter(Context context, HashMap<UUID, Room> room) {
super(context, R.layout.list_item_room, new ArrayList<>(room.values()));
}
,这是您调用Collection
时得到的。
答案 1 :(得分:0)
原因是room.values()
未返回HashMap#values()
。它返回一个ArrayList
对象,其中包含Collection<T>
中的所有值。 Map
是ArrayList<T>
,但Collection<T>
不一定是Collection<T>
,因此您的适配器不知道如何处理该集合。它可以是ArrayList<T>
,也可以是ArrayList
,可以是HashSet
,也可以是Vector
或从LinkedBlockingQueue
延伸的任意数量的对象{1}}。它实际上可能是只有HashMap知道的自定义实现。关键是底层集合是什么并不重要,并且HashMap不会对它将返回的内容做出任何保证,因此这就是您坚持使用的界面。
您可以通过将值复制到ArrayList来修复代码,如下所示:
Collection
但是,因为它是HashMap ,所以无法保证您放置项目的顺序与您收到它们的顺序相同。
但是值将以HashMap决定将它们放入的任意顺序排列。
更可预测的HashMap实现是LinkedHashMap,可以满足您的需求。