一、适配器是什么?
适配器是视图与数据之间的桥梁,用来处理数据并将数据绑定到AdapterView上。例如QQ或微信的聊天菜单,都可以用适配器实现。
二、实现步骤
1.准备好一些水果图片
放在res/drawable下:
2.整理好布局demo
fruit_item.xml:作为一项,相当于一条记录。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp">
<ImageView
android:id="@+id/fruitImage"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/fruitName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"/>
</LinearLayout>
activity_main.xml:主布局,添加一个listview。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
2.关键类
Fruit.kt:作为实体类。
class Fruit(val name : String,val imageId:Int)
FruitAdapter.kt:适配器实现类。
//该类定义了一个主构造函数,继承一个父类,重写getVIew方法,当子项
class FruitAdapter(activity: Activity,val resourceId:Int,data:List<Fruit>) : ArrayAdapter<Fruit>(activity,resourceId,data){
//继续进行优化,不用重复去获取实例,借助ViewHolder来优化
//对fruitImageView,fruitName进行缓存
//inner表示是内部类
inner class ViewHolder(var fruitImageView: ImageView,val fruitName : TextView)
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view : View
val viewHolder : ViewHolder
//convertView进行判断,如果为空,使用LayoutInflater去调用,如果不为空,就 view = convertView
if(convertView == null){
//为null时创建一个ViewHolder对象,并将实例放在VIewHolder里面
view = LayoutInflater.from(context).inflate(resourceId,parent,false)
val fruitImage : ImageView = view.findViewById(R.id.fruitImage)
val fruitName : TextView = view.findViewById(R.id.fruitName)
viewHolder = ViewHolder(fruitImage,fruitName)
//这里的tag将viewHolder存储在VIew中
view.tag = viewHolder
//所有的控件都缓存在viewHolder中,就没必要重复view.findViewById了
}else{
//当convertView不为null是,直接将ViewHolder取出来
view = convertView
viewHolder = view.tag as ViewHolder
}
var fruit = getItem(position)
if(fruit !=null){
viewHolder.fruitImageView.setImageResource(fruit.imageId)
viewHolder.fruitName.text = fruit.name
}
return view
}
}
MainActivity.kt:关键类,作为功能的实现。
class MainActivity : AppCompatActivity() {
private val fruitList = ArrayList<Fruit>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//初始化水果的参数
initFruits()
//listview用于展示很多的数据
val listView : ListView
listView = findViewById(R.id.listview)
val adapter = FruitAdapter(this,R.layout.fruit_item,fruitList)
listView.adapter = adapter
listView.setOnItemClickListener{
_,_,postion,_-> val fruit = fruitList[postion]
Toast.makeText(this,fruit.name,Toast.LENGTH_SHORT).show()
}
}
private fun initFruits(){
repeat(2){
fruitList.add(Fruit("apple",R.drawable.apple))
fruitList.add(Fruit("Banana",R.drawable.banana))
fruitList.add(Fruit("orange",R.drawable.orange))
fruitList.add(Fruit("Watermelon",R.drawable.watermelon))
fruitList.add(Fruit("pear",R.drawable.pear))
fruitList.add(Fruit("Grape",R.drawable.grape))
fruitList.add(Fruit("pineapple",R.drawable.pineapple))
fruitList.add(Fruit("strawberry",R.drawable.strawberry))
fruitList.add(Fruit("cherry",R.drawable.cherry))
fruitList.add(Fruit("mango",R.drawable.mango))
}
}
}
总结
相比于java,kotlin就变得十分简洁,短短几行代码就实现了功能。
目前安卓中,kotlin代码的含有量越来越高,让我们一起学习起来吧。