尝试在 Kotlin 片段中实现 RecyclerView

Trying to implement a RecyclerView in a Kotlin Fragment

我正在尝试实现 RecyclerView,我遵循了本教程: https://developer.android.com/codelabs/basic-android-kotlin-training-recyclerview-scrollable-list#4

但我试图将它实现到一个片段而不是主要片段中 activity,但它最终无法正常工作,所以我开始学习本教程:https://www.youtube.com/watch?v=__gxd4IKVvk

大约 24 分钟后,我们将代码写入片段的 .kt 文件中,而他使用的是现已弃用的方法 (onActivityCreated),因此我将代码放入 onCreateView 中。他可以通过将 xml 文件写成 var 来访问 id,但这对我不起作用,所以我在将布局扩展到 val“视图”后访问了它。然后他访问了 RecyclerView 的一些属性(.layoutManager、.itemAnimator、.adapter),但是 IDE 表示这些都是未解析的引用。我在网上找到的所有内容都表明它应该可以正常工作,或者我应该使用“.setLayoutManager”和“.setAdapter”,但它们会给出相同的错误。我不明白我错过了什么。

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_exercises, container, false)
    val recyclerItems = view.findViewById<RecyclerView>(R.id.exercise_recycler_view)
        .hasFixedSize()
    recyclerItems.layoutManager = LinearLayoutManager(context)
    recyclerItems.itemAnimator = DefaultItemAnimator()
    recyclerItems.adapter = ExerciseItemAdapter(viewModel)

    return view
}

这是.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background"
    tools:context=".fragments.ExercisesFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/exercise_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        app:layoutManager="LinearLayoutManager" />
</LinearLayout>

我浏览了您提供的视频。

视频中的人能够直接访问 RecyclerView,因为他正在使用 kotlin 合成插件:

apply plugin: 'kotlin-android-extensions'

注意:哪个已弃用,您使用的是正确的。或者您可以使用更新的 ViewBinding。

为什么那些未解决的引用?

因为

val recyclerItems = view.findViewById<RecyclerView>(R.id.exercise_recycler_view)
        .hasFixedSize()

recyclerItems 变成 Boolean 类型而不是 RecyclerView.

所以这样做:

val recyclerItems = view.findViewById<RecyclerView>(R.id.exercise_recycler_view)
        
recyclerItems.hasFixedSize()