![](/img/trans.png)
[英]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.