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代替:
- 在模块级
build.gradle的android配置块中开启View Binding:
android { // 其他配置 buildFeatures { viewBinding true } }- 同步项目后修改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
相关产品推荐
相关产品推荐

