在 kotlin 中使用 .contains 方法忽略变量?

Ignore variable with .contains method in kotlin?

提问人:Taimoor Khan 提问时间:10/6/2023 最后编辑:Taimoor Khan 更新时间:10/7/2023 访问量:47

问:

忽略 contains 函数中的属性。我的意思是,如果属性值发生变化,它仍然是同一个对象。

我已经在 RecyclerView android 中实现了对象跟踪。现在,当某些产品受到欢迎时,请单击 .它的属性之一heart icon

 isFavourite = true /// become true

以下方法调用 RecyclerViewonScrollStateChanged

 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)
                }
            }
        }
    }
}  

现在,从任何 .属性名称 isFavorite 已在数据库中更新。我想忽略包含中的那个变量。heart iconproduct

我试图用 kotlin 编写一个数据类,并将 isFavorite 从基本构造函数中取出,以便 equal 、hash 等不起作用。

但包含与所有属性匹配的函数。我怎么能忽略包含的变量。

可追踪对象.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())
    }
}

                   
Android 列表 Kotlin 包含

评论

1赞 Vlad Guriev 10/6/2023
为什么你认为“包含函数匹配所有属性”?它在引擎盖下使用,因此有关从基本构造函数中排除的解决方案应该有效equals()isFavourite

答:

1赞 Tenfour04 10/6/2023 #1

将属性移出构造函数应该有效。它应该看起来像这样:

data class MyItem(
    val id: Long,
    val foo: String
) {
    var isFavourite: Boolean = false
}

但是,我认为最好将其保留在您的构造函数中,这样您就不会出于其他目的(例如在 DiffUtil 中使用它们)破坏 / 功能。equalshashCode

在这种情况下,您可以使用 代替 .由于您必须手动遍历所有属性,因此我会将其分解为一个函数,以保持您的逻辑更具可读性。anycontains

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)
 }   

评论

0赞 Taimoor Khan 10/7/2023
我在我的问题中添加了一些细节。.contains 函数是用父类编写的,我无法为它们覆盖 .contains,因为 TrackableObject(父类)没有任何属性
0赞 Tenfour04 10/7/2023
因此,请使用答案前半部分的建议。
0赞 Taimoor Khan 10/9/2023
我有两个几乎同名的房产是 FavouriteOffer 和 isFavorite 。我错误地将另一个键从构造函数中取出。