簡體   English   中英

Android Studio Kotlin Boolean.Companion問題

[英]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_VALUEMIN_VALUESIZE_BYTESSIZE_BITS 通常你會直接在Int class 上訪問這些,比如Int.MAX_VALUE - 當你這樣做時,你實際上是在配套的 object 上訪問它們,這就是為什么將值Int分配給一個變量會給你配套的 ZA8CFDE6331BD59EB662AC96F

所以同樣適用於var status = Boolean - 它是Boolean伴侶 object 這就是為什么您的 function 必須返回Boolean.Companion ,因為它正在返回status ,這就是status 不是truefalse的 boolean 值。


您可能想這樣做是有原因的 - 不過這不太可能,而且您嘗試使用它的方式(想要來自getStatusBoolean )表明這是一個錯誤,而且您不熟悉語。 真的建議您瀏覽基本的介紹內容,以了解您如何定義變量及其類型,但這可能是您想要的:

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的引用,例如TextViewCheckbox ,因此您可以執行以下操作

holder.taskTextView.text = item.getTask()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM