提问人:Taimoor Khan 提问时间:10/6/2023 最后编辑:Taimoor Khan 更新时间:10/7/2023 访问量:47
在 kotlin 中使用 .contains 方法忽略变量?
Ignore variable with .contains method in kotlin?
问:
忽略 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 icon
product
我试图用 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())
}
}
答:
1赞
Tenfour04
10/6/2023
#1
将属性移出构造函数应该有效。它应该看起来像这样:
data class MyItem(
val id: Long,
val foo: String
) {
var isFavourite: Boolean = false
}
但是,我认为最好将其保留在您的构造函数中,这样您就不会出于其他目的(例如在 DiffUtil 中使用它们)破坏 / 功能。equals
hashCode
在这种情况下,您可以使用 代替 .由于您必须手动遍历所有属性,因此我会将其分解为一个函数,以保持您的逻辑更具可读性。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)
}
评论
0赞
Taimoor Khan
10/7/2023
我在我的问题中添加了一些细节。.contains 函数是用父类编写的,我无法为它们覆盖 .contains,因为 TrackableObject(父类)没有任何属性
0赞
Tenfour04
10/7/2023
因此,请使用答案前半部分的建议。
0赞
Taimoor Khan
10/9/2023
我有两个几乎同名的房产是 FavouriteOffer 和 isFavorite 。我错误地将另一个键从构造函数中取出。
评论
equals()
isFavourite