[英]Android Studio Kotlin Boolean.Companion problem
在我的代碼中,我想以 item.getStatus()) 作為參數執行 holder.task.setChecked() 命令。
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = data[position]
holder.task.text = item.getTask()
holder.task.setChecked(item.getStatus())
}
問題是 setChecked 需要類型Boolean ,但從 getStatus function 我得到Boolean.Companion作為回報。
class Model(itemView: View) : RecyclerView.ViewHolder(itemView) {
private var id = Int
private var status = Boolean
private var task = String
fun getStatus(): Boolean.Companion {
return status
}
當我嘗試更改此 function 的返回類型時,我得到一個錯誤。
一直在思考如何將類型更改為相等,但我似乎找不到解決方案。
需要明確的是,setChecked function 是默認的 function ,它在復選框object 上執行
setChecked
function 需要一個Boolean
參數,但getStatus
的返回類型是Boolean.Companion
。 這是因為您已將status
字段定義為Boolean.Companion
類型。
要解決此問題,您可以將status
定義為普通的 class 級別字段並分配默認值,或提供構造函數來適當地初始化該值。
private var status: Boolean = false // or true, depending on the default value that suits here
然后您可以更改getStatus
function 以返回Boolean
類型而不是Boolean.Companion
fun getStatus(): Boolean {
return status
}
然后用它來調用holder.task.setChecked(item.getStatus())
。
您的示例代碼非常不尋常,我不確定您是否真的打算在這里做您正在做的事情。
這例如
private var id = Int
不持有Int
。 id
不是數字。 它實際上是Int
class 的伴侶 object ,在這種情況下,它包含常量MAX_VALUE
、 MIN_VALUE
、 SIZE_BYTES
和SIZE_BITS
。 通常你會直接在Int
class 上訪問這些,比如Int.MAX_VALUE
- 當你這樣做時,你實際上是在配套的 object 上訪問它們,這就是為什么將值Int
分配給一個變量會給你配套的 ZA8CFDE6331BD59EB662AC96F 。
所以同樣適用於var status = Boolean
- 它是Boolean
的伴侶 object 。 這就是為什么您的 function 必須返回Boolean.Companion
,因為它正在返回status
,這就是status
。 它不是true或false的 boolean 值。
您可能想這樣做是有原因的 - 不過這不太可能,而且您嘗試使用它的方式(想要來自getStatus
的Boolean
)表明這是一個錯誤,而且您不熟悉語。 我真的建議您瀏覽基本的介紹內容,以了解您如何定義變量及其類型,但這可能是您想要的:
class Model(itemView: View) : RecyclerView.ViewHolder(itemView) {
private var id: Int = -1
private var status: Boolean = false
private var task: String = ""
fun getStatus(): Boolean {
return status
}
}
我已經為每個添加了默認值,因為您必須將它們初始化為某些東西- 如果您有一個發生這種情況的init
塊,您可以省略這些值。 如果您在此處分配它們,您也可以省略類型(例如var id = -1
),除非您需要比值更具體(例如,如果您希望它是可為空的Int?
類型)。
您還可以將這些值放在構造函數中:
class Model(
itemView: View,
private var id: Int,
private var status: Boolean,
private var task: String
)
這將要求調用者提供一些初始值。 這取決於你想要什么!
如果你願意,你也可以這樣做替換吸氣劑 function:
var status: Boolean = false
private set
這使得status
屬性公開,但從外部只讀。
僅供參考,您的Model
class 看起來像您的RecyclerView
適配器的數據- 它不應該是ViewHolder
,這些是完全獨立的東西。 只需為您的 Model 使用基本的Model
(甚至更好, data class
)並在您的數據列表中使用它。
ViewHolder
是特殊的對象,可以重用以顯示不同的數據項 - 根據定義,數據項通常比ViewHolder
的數量多(這就是RecyclerView
的全部意義 - 它回收它們)。 您不應該將它們保存在列表中,或者將單個項目的 state 存儲在其中。
將您的數據項保存在列表中,在position
中的onBindViewHolder
處獲取一個,然后將其顯示在您提供的ViewHolder
中。 您現在所擁有的將無法正常工作,因此您需要查看設置教程,例如文檔中的這個。 您需要存儲對您在 VH 中使用的View
的引用,例如TextView
和Checkbox
,因此您可以執行以下操作
holder.taskTextView.text = item.getTask()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.