【问题标题】:recyclerview in fragment context not working in kotlin片段上下文中的recyclerview在kotlin中不起作用
【发布时间】:2021-01-30 19:24:36
【问题描述】:

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

它运行良好...直到我在 HomeFragment.kt 中创建 HomeFragment 类,它膨胀了 fragment_home.xml

那我想在函数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 问题......

我尝试将this 替换为activitycontextContextapplicationContext,但完全没有成功...

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)

我正在检查这个answer,但没有成功...

做错了什么?谢谢

【问题讨论】:

    标签: android kotlin android-recyclerview


    【解决方案1】:

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

    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())
    

    【讨论】:

      【解决方案2】:

      由于您在 Fragment 中,因此无法将其作为上下文传递:

      val homeMenuAdapter = HomeMenuAdapter(arrayHomeMenu, this)
      

      在上面的代码中,您尝试将片段作为上下文传递,因此您可以做的是获取片段的上下文。所以你可以这样做:

      val homeMenuAdapter = HomeMenuAdapter(arrayHomeMenu, requireContext())
      

      【讨论】:

      • 片段通常是某些活动的一部分,需要/获取上下文将为您提供通常是活动的父上下文。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多