簡體   English   中英

如何在 RecyclerView.Adapter 中獲取 LifecycleOwner 參考?

[英]How can I get LifecycleOwner reference in RecyclerView.Adapter?

目前,我使用mLifecycleOwner = mContext as LifecycleOwner來獲取LifecycleOwner ,它可以工作,但我認為它不是一個好的代碼。

如何從ListAdapter獲取LifecycleOwner

class VoiceAdapters (private val aHomeViewModel: HomeViewModel, private val mPlay: PlayInterface):
        ListAdapter<MVoice, VoiceAdapters.VoiceViewHolder>(MVoiceDiffCallback()) {

    private lateinit var mContext: Context
    private lateinit var mLifecycleOwner:LifecycleOwner

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VoiceViewHolder {
        mContext = parent.context
        mLifecycleOwner = mContext as LifecycleOwner

        return VoiceViewHolder(
            LayoutVoiceItemBinding.inflate(LayoutInflater.from(parent.context), parent, false).also {               
               it.lifecycleOwner = mLifecycleOwner
               it.aHomeViewModel = aHomeViewModel
            }
        )
    }

    ...
}
  1. 將其作為構造函數參數傳遞給VoiceAdapters
  2. 創建擴展屬性:
   val View.lifecycleOwner get() = ViewTreeLifecycleOwner.get(this)`

然后訪問它: parent.lifecycleOwner

  1. 只解決一次:

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VoiceViewHolder {
       if(!::lifecycleOwner.isInitialized){
        lifecycleOwner = parent.context as LifecycleOwner
      }
}

它們指向同一個LifecycleOwner ,即用於擴展布局的Context

ViewTreeLifecycleOwner.get(view)是獲取視圖底層LifecycleOwner的便捷方式。 因此,我的兩分錢 go 選擇 1 或 2。

如果您通過構造函數在適配器中傳遞context ,則可以使用. 操作員。

暫無
暫無

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

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