簡體   English   中英

片段上下文中的 recyclerview 在 kotlin 中不起作用

[英]recyclerview in fragment context not working in kotlin

我在fragment_home.xml中創建了一個非常基本的recyclerview ,它鏈接到插入到activity_main.xml中的<FrameLayout />

它運作良好......直到我在 HomeFragment.kt 中創建HomeFragment HomeFragment.kt ,它膨脹了fragment_home.xml

然后我想在 function onActivityCreated()中添加 arrayList ( arrayHomeMenu )

我的問題是這條線

  val homeMenuAdapter = HomeMenuAdapter(arrayHomeMenu, this) //context "this" appears with red underline

它檢索錯誤,所以我不能繼續......

HomeFragment.kt

   class HomeFragment : Fragment() {
   override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
    ): View?{
    return inflater.inflate(R.layout.fragment_home, container, false)

 }


override fun onActivityCreated(savedInstanceState: Bundle?){
    super.onActivityCreated(savedInstanceState)


    //create list of words
    val arrayHomeMenu = ArrayList<HomeMenuModel>()

    arrayHomeMenu.add(HomeMenuModel("Verbs","List of 461  words", R.drawable.ic_logo))
    arrayHomeMenu.add(HomeMenuModel("Nouns","List of 52 words", R.drawable.ic_logo))
    arrayHomeMenu.add(HomeMenuModel("Adjectives","List of 65 words", R.drawable.ic_logo))
    arrayHomeMenu.add(HomeMenuModel("Adverbs","List of 345 words", R.drawable.ic_logo))

    val homeMenuAdapter = HomeMenuAdapter(arrayHomeMenu, this) //context "this" appears with red underline


    homeMenu_recyclerView.layoutManager = LinearLayoutManager(context)
    homeMenu_recyclerView.adapter = homeMenuAdapter

}

這是一個context問題....

我試圖用activitycontextContextapplicationContext替換this ,但根本沒有成功......

HomeMenuAdapter.kt

class HomeMenuAdapter(val arrayList: ArrayList<HomeMenuModel>, val context: Context) :
RecyclerView.Adapter<HomeMenuAdapter.ViewHolder>() {

    ....//correct content
   }

當我在activity_main.xml直接創建 recyclerview 並直接使用MainActivity.kt時,它可以正常工作

一旦我將 recyclerview 移動到一個片段......它會引發上述錯誤。

HomeMenuModel.kt

  class HomeMenuModel(val hm_title:String,val hm_description: String, val hm_image:Int)

我正在檢查這個答案,但沒有成功......

做錯了什么? 謝謝你

之所以可以在 Activity 中使用this作為上下文,是因為Activity擴展了 Context。

但是Fragment不擴展 Context 所以你不能使用this

activitycontext也不起作用的原因是 Kotlin 對可空類型的區別。 雖然activitycontext確實返回一個上下文,但返回值是可以為空的。 您可以通過密切注意將鼠標懸停在紅色下划線上時出現的錯誤消息來看到這一點:

Type mismatch.
Required:
Context
Found:
Context? (or FragmentActivity?)

問號表示這是一個可為空的類型,而一個不可為空的 Context 是必需的。 它們可以為空的原因是 Fragment 只能在 Activity 附加到它時檢索它,但情況並非總是如此。

然而,Fragment 有一個方便的方法叫做requireContext()來解決這個問題。 它具有不可為空的返回類型,但如果它無法檢索上下文,則會引發異常,因此您必須確保僅在附加 Fragment 時調用它。

簡而言之,您應該能夠像這樣實例化您的適配器:

val homeMenuAdapter = HomeMenuAdapter(arrayHomeMenu, requireContext())

由於您在 Fragment 中,因此不能將其作為上下文傳遞:

val homeMenuAdapter = HomeMenuAdapter(arrayHomeMenu, this)

在上面的代碼中,您嘗試將片段作為上下文傳遞,因此您可以做的是獲取片段的上下文。 所以你可以這樣做:

val homeMenuAdapter = HomeMenuAdapter(arrayHomeMenu, requireContext())

暫無
暫無

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

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