忽略 contains 函数中的属性。我的意思是,如果属性值发生变化,它仍然是同一个对象。
我已经在 RecyclerView android 中实现了对象跟踪。现在,当通过单击
heart icon
来收藏某些产品时。它的属性之一
isFavourite = true /// become true
在
RecyclerView的
onScrollStateChanged
上调用以下方法
private fun trackVisibleItems(visiblePositions: IntRange) {
for (position in visiblePositions) {
if (position != -1) {
trackableCollectionCallback?.getViewedItem(position)?.let {
if(isPresent() && shownTrackablePositions.contains(it).not()){
it.trackView()
trackableCollectionCallback?.onTrackedItem(it,position)
shownTrackablePositions.add(it)
}
}
}
}
}
现在从任意
heart icon
选择 product
后。属性名称 isFavourite 已在数据库中更新。我想忽略 contains 中的变量。
我尝试在 kotlin 中编写一个 data 类,并将 isFavourite 从基本构造函数中取出,这样 equal 、 hash 等就不起作用了。
但包含匹配所有属性的函数。我怎么能忽略 contains 中的 var。
TrackableObject.kt
abstract class TrackableObject {
abstract fun getClickEventName(): String
abstract fun getViewEventName(): String
abstract fun getTrackParams(): MutableSet<Pair<String, Any>>
fun trackClick() {
Analytics.trackEvent(getClickEventName(), getTrackParams())
}
fun trackView() {
Analytics.trackEvent(getViewEventName(), getTrackParams())
}
}
将属性移出构造函数应该可以。它应该看起来像这样:
data class MyItem(
val id: Long,
val foo: String
) {
var isFavourite: Boolean = false
}
但是,我认为最好将其保留在构造函数中,这样就不会为了其他目的而破坏
equals
/hashCode
功能,例如在 DiffUtil 中使用它们。
在这种情况下,您可以使用
any
代替 contains
。由于您必须手动检查所有属性,因此我将其分解为一个函数以使您的逻辑更具可读性。
data class MyItem(
val id: Long,
val foo: String,
var isFavourite: Boolean = false
)
fun Iterable<MyItem>.containsMatch(item: MyItem): Boolean = any {
it.id == item.id && it.foo == item.foo
}
// ...
if(isPresent() && shownTrackablePositions.containsMatch(it).not()){
it.trackView()
trackableCollectionCallback?.onTrackedItem(it,position)
shownTrackablePositions.add(it)
}