实现SortedList方法的回调
问题描述
RecyclerView库最近添加了新的SortedList
类。假设我有一个实现SortedList
方法的回调,该方法可以随时间变化,即可以将基础Comparator切换出去。告诉compare()
完全重新使用其数据的最佳方法是什么?
思路一:
这是我自己的观点(用科特林写):
compare()
您可以看到,每次调用SortedList
后,我都会跟踪新索引,因此每个项目只能重新执行一次,并且不会跳过任何项目。
此方法有效,但似乎非常浪费,因为list.beginBatchedUpdates() val indices = (0..list.size() - 1).toArrayList() while (!indices.isEmpty()) { val i = indices.first() val item = list.get(i) list.recalculatePositionOfItemAt(i) [suppress("USELESS_CAST_STATIC_ASSERT_IS_FINE")] indices.remove(list.indexOf(item) as Any) //cast to disambiguate remove() } list.endBatchedUpdates()
会两次调整基础数组的大小以删除并读取该项目。 recalculatePositionOfItemAt()
然后将执行新的二进制搜索,即使该索引是已知的。
Edit:如果项目比较相等,这似乎导致无限循环。
替代方法(全部删除,然后全部添加):
recalculatePositionOfItemAt()
思路二:
[遗憾的是,没有api。只需复制源并自己添加该方法即可。支持数据只是一个数组,因此您可以在其上调用Arrays.sort,然后调用通知数据集已更改。当整个世界都在变化时,跟踪变化并不是一件容易的事,因此对于排序列表而言,这并不是真正合适的情况。请在b.Android.com上创建功能请求。
思路三:
以下方法对我有用,可以切换到新的比较器以重新排序列表。我发现动画更加流畅了,另外调用了indexOf
list.beginBatchedUpdates()
val copy = (list.size() - 1 downTo 0).map { list.removeItemAt(it) }
copy.forEach { list.add(it) }
list.endBatchedUpdates()
爱站技术频道小编分享了三种思路方法给大家,希望你们看完“实现SortedList方法的回调”文章后都知道怎么处理了。 没有看过瘾的朋友,来网站翻阅吧,会让你收获满满。