自己实现的适配器构造函数不接受hashMap.values()

时间:2016-06-01 21:17:14

标签: java android hashmap

我从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?

2 个答案:

答案 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>中的所有值。 MapArrayList<T>,但Collection<T>不一定是Collection<T>,因此您的适配器不知道如何处理该集合。它可以是ArrayList<T>,也可以是ArrayList,可以是HashSet,也可以是Vector或从LinkedBlockingQueue延伸的任意数量的对象{1}}。它实际上可能是只有HashMap知道的自定义实现。关键是底层集合是什么并不重要,并且HashMap不会对它将返回的内容做出任何保证,因此这就是您坚持使用的界面。

您可以通过将值复制到ArrayList来修复代码,如下所示:

Collection

但是,因为它是HashMap ,所以无法保证您放置项目的顺序与您收到它们的顺序相同
但是值将以HashMap决定将它们放入的任意顺序排列。

更可预测的HashMap实现是LinkedHashMap,可以满足您的需求。