You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin搭建RecyclerView时recyclerView未实例化即可调用方法的问题求解

问题原因说明

你看到的无需初始化直接使用recyclerView变量的能力,来自曾经官方推出的Kotlin Android Extensions(业内也常称合成视图绑定),这是Kotlin对Android开发提供的专属扩展能力,核心作用就是省去findViewById的重复代码。

原理逻辑

你贴出的示例代码顶部有这行导入声明:

import kotlinx.android.synthetic.main.activity_main.*

这就是合成视图绑定的对应导入:插件会自动扫描你activity_main.xml布局中所有控件的android:id属性,生成和id同名的全局变量,只要导入对应布局的synthetic包,在调用setContentView加载对应布局之后,就可以直接用变量名访问控件。示例里用到的recyclerView,就是布局文件中RecyclerView控件设置的id值。

你本地代码报错的原因

Kotlin Android Extensions早在2020年就被谷歌官方废弃,现在新版Android Studio创建的项目默认不会开启该插件,所以你没有做对应配置的情况下,编译器找不到recyclerView变量的声明,就会报unresolved reference错误。

两种解决方式

  • (仅适配老代码,不推荐)开启Kotlin Android Extensions插件:在模块级build.gradle文件的plugins配置块中添加id 'kotlin-android-extensions',同步项目后即可复用示例的写法。
  • (官方推荐现行方案)使用View Binding代替:
    1. 在模块级build.gradle的android配置块中开启View Binding:
    android {
        // 其他配置
        buildFeatures {
            viewBinding true
        }
    }
    
    1. 同步项目后修改Activity代码:
    // 去掉原来的synthetic导入
    import android.os.Bundle
    import android.support.v7.widget.LinearLayoutManager
    import android.view.Window
    import android.view.WindowManager
    import android.widget.LinearLayout
    import net.simplifiedcoding.recyclerviewexample.CustomAdapter
    // 导入自动生成的View Binding类,包名替换为你自己项目的包名
    import com.yourprojectpackage.databinding.ActivityMainBinding
    
    
    class MainActivity : Activity() {
        private lateinit var binding: ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            requestWindowFeature(Window.FEATURE_NO_TITLE)
            window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
            
            // 初始化View Binding
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            val users = ArrayList<Model_Details>()
            users.add(Model_Details("Kaju katli", "Kaju katli, also known as kaju Katari or kaju barfi, is an Indian dessert similar to a barfi.",R.drawable.kaju))
            users.add(Model_Details("Doughnut", "The doughnut is popular in many countries and prepared in various forms as a sweet snack that can be homemade or purchased in bakeries, supermarkets, food stalls, and franchised specialty outlets",R.drawable.donuts))
            users.add(Model_Details("Panna cotta", "Panna cotta is an Italian dessert of sweetened cream thickened with gelatin and molded. The cream may be aromatized with rum, coffee, vanilla, or other flavorings.",R.drawable.panna_cotta))
            users.add(Model_Details("Rose Cookies", "Rose cooky is a famous South Indian snack made during festivals",R.drawable.rosecookies))
            users.add(Model_Details("Belgian waffle", "In North America, Belgian waffles are a variety of waffle with a lighter batter, larger squares, and deeper pockets than ordinary American waffles",R.drawable.belgianwaffle))
    
            val obj_adapter = CustomAdapter(users)
    
            // 通过binding访问对应控件
            binding.recyclerView.layoutManager = LinearLayoutManager(this, LinearLayout.VERTICAL, false)
            binding.recyclerView.adapter = obj_adapter
        }
    }
    

内容的提问来源于stack exchange,提问作者Louis Sankey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 09:57:02