基于kotlin实现适配器示例

一、适配器是什么?

适配器是视图与数据之间的桥梁,用来处理数据并将数据绑定到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代码的含有量越来越高,让我们一起学习起来吧。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值