一.基于ViewBinding绑定布局
(1)由于是跟着《第一行代码》进行实践,其中源码基本还是用的kotlin-android-extensions,所以直接改成ViewBinding比较方便,就暂时不用Jetpack Compose了
不过我下载的AndroidStudio似乎默认使用Jetpack Compose,一开始还是比较困惑的,以为ViewBinding也被弃用了,其实只需要去掉相应内容,再添加layout包就行了。
AndroidStudio默认的部分代码
(2)找到bulid.gradle去除Jetpack Compose的依赖并添加ViewBinding的依赖,记得点击syns project刷新
(3)右键ui.theme包,去除整个theme包
(4)在res包中新建layout包,在layout包中新建activity_main布局
(5)改写MainActivity文件
去除爆红与未用到文件,在onCreate()方法中添加binding,按Tab键可以快速填充并导入对应Binding类,补充后代码如下:
package com.example.fortest
import android.os.Bundle
import androidx.activity.ComponentActivity
import com.example.fortest.databinding.ActivityMainBinding
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
}
(6)接下来就可以正常使用ViewBinding绑定布局了,了解用法后可以将用kotlin-android-extenison的源码发给gpt改写
二.RecyclerView的基本实现
(1)添加依赖
implementation("androidx.recyclerview:recyclerview:1.3.2")
(2)在布局中加入RecyclerView控件
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
(3)准备适配器
以《第一行代码》中的示例为例
package com.example.recycleviewtest
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.example.recycleviewtest.databinding.FruitItemBinding
class FruitAdapter(private val fruitList: List<Fruit>) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() {
inner class ViewHolder(val binding: FruitItemBinding) : RecyclerView.ViewHolder(binding.root) {
init {
binding.root.setOnClickListener {
val position = adapterPosition
if (position != RecyclerView.NO_POSITION) {
val fruit = fruitList[position]
Toast.makeText(binding.root.context, "You clicked view ${fruit.name}", Toast.LENGTH_SHORT).show()
}
}
binding.fruitImage.setOnClickListener {
val position = adapterPosition
if (position != RecyclerView.NO_POSITION) {
val fruit = fruitList[position]
Toast.makeText(binding.root.context, "You clicked image ${fruit.name}", Toast.LENGTH_SHORT).show()
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = FruitItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val fruit = fruitList[position]
holder.binding.fruitImage.setImageResource(fruit.imageId)
holder.binding.fruitName.text = fruit.name
}
override fun getItemCount() = fruitList.size
}
(4)使用RecyclerView,以下是在MainActivity中使用
class MainActivity : ComponentActivity() {
private lateinit var binding: ActivityMainBinding
private val fruitList = ArrayList<Fruit>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
initFruits() // 初始化水果数据,自行编写,这里不再展示
val layoutManager = LinearLayoutManager(this)
binding.recyclerView.layoutManager = layoutManager
val adapter = FruitAdapter(fruitList)
binding.recyclerView.adapter = adapter
}