[英]RecyclerView not working on Fragment | Kotlin | Firebase
[英]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
問題....
我試圖用activity
, context
, Context
, applicationContext
替換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
。
activity
, context
也不起作用的原因是 Kotlin 對可空類型的區別。 雖然activity
和context
確實返回一個上下文,但返回值是可以為空的。 您可以通過密切注意將鼠標懸停在紅色下划線上時出現的錯誤消息來看到這一點:
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.