我的ViewModel
观察者返回一个ArrayList<ContactObject>
(contactsList
),我想在使用修改的ArrayList<ContactObject>
设置RecyclerView
之前过滤和排序。
过滤器按预期工作(它返回List<ContactObject>
,我可以将其转换为ArrayList<ContactObject>
):
var filteredContactsList = contactsList.filter { contact -> !contact.sites.contains(siteId) } as ArrayList<ContactObject>
但是我不能得到任何排序函数工作-我已经尝试过:
var sortedList = contactsList.sortBy {(it as ContactObject).contactName} as ArrayList<ContactObject>
var sortedList = contactsList.sortedWith(compareBy { it.contactName }) as ArrayList<ContactObject>
但是我得到了下面的异常:
java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
所以我试图理解为什么这些函数返回不同类型的列表比.filter
或者如果我只是使用它们不正确?
var sortedList = ArrayList<ContactObject>()
sortedList.addAll(contactsList.sortedWith(compareBy { it.contactName }))
然而,我必须在我的ViewModel中创建额外的变量,这是我希望避免的(即我要将contactsList.sortedWith(compareBy { it.contactName })
直接传递给recyclerView
)
如果打印返回类型的类名,您将知道sortedWith返回的对象的类类型是java.util。数组$ArrayList,而过滤器返回的对象是java.util.ArrayList。因此,即使类名看起来相同,但当您强制转换过滤器的输出时,它是成功的(它是类型ArrayList),但另一个失败(java.util。$ArrayList有相同的名称,但嵌套在Arrays类中。
这两个类都扩展了AbstractList类,后者又实现了List接口。我认为正因为如此,你看到的类型是List,但具体的实现是不同的。一个是java.util。数组$ArrayList,另一个是java.util.ArrayList .