我的 viewModel 包含一些變數,例如應該在 recyclerView 中創建多少 cardView。因此,我正在尋找在我的配接器類中訪問相同 viewModel 物件的方法。有沒有辦法這樣做或更好的選擇?我的代碼在 kotlin 中
class RecyclerAdapter : RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {
private val gameViewModel: GameViewModel by activityViewModels()
uj5u.com熱心網友回復:
您的 Fragment 視圖的生命周期應該比關聯的 ViewModel 短,因此可以將其作為建構式引數傳入。
class RecyclerAdapter(private val gameViewModel: GameViewModel) :
RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {
//...
}
然后在實體化配接器時從 Fragment 傳入視圖模型參考onViewCreated()。
就個人而言,我不會這樣做,因為大概您的 ViewModel 中有很多與配接器無關的東西。關注點分離。我只會為需要的屬性設定引數,并讓 Fragment 從 ViewModel 傳遞它們。
uj5u.com熱心網友回復:
由于您只提供了 2 行代碼,因此很難確切地知道您做錯了什么。
通常,您會在 Activity 類或 Fragment 類中檢索 ViewModel,如下所示
class MyActivity /* other stuff */ {
// this line produces/retrieves an instance of GameViewModel
// where its owner is MyActivity
private val gameViewModel: GameViewModel by viewModels()
}
然后在您的活動類中的其他地方,實體化您的 RecycleAdapter 類。在那里你可以將 gameViewModel 傳遞給它。當然,為了能夠做到這一點,您的 RecyclerAdapter 要么必須接受 GameViewModel 作為建構式引數,要么通過 setter 或其他一些函式呼叫。
這是通過建構式引數的示例。您的 RecyclerAdapter 類必須像這樣定義(請注意,這是用于宣告屬性并從主建構式初始化它們的 Kotlin 簡潔語法)
class RecyclerAdapter(
private val gameViewModel: GameViewModel,
// add more constructor parameters/class properties here if needed
) : RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {
// other class properties that you don't want to initialize
// through the primary constructor
// ...
// the class body where you implement RecyclerView.Adapter<> methods
// ...
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// gameViewModel can be used here
gameViewModel.doSomething()
}
}
最后一步,修改代碼中的行,在其中創建 RecyclerAdapter 實體
// here we create a new RecyclerAdapter and pass the gameViewModel to it
val adapter = RecyclerAdapter(gameViewModel)
recyclerView.adapter = adapter
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/371512.html
上一篇:我想標記日期,但我不知道該怎么做
