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

如何用Kotlin创建Adapter文件?旧教程中的Adapter代码是否正确?

你的Kotlin Adapter代码问题分析与正确创建方法

一、现有代码的问题

你的代码能正常运行,但存在三个核心问题,会影响列表性能和可维护性:

  1. 未复用ConvertView,性能极差
    每次调用getView都重新inflate布局,列表滚动时会频繁创建销毁View,导致卡顿、内存占用飙升,这是ListView Adapter的典型错误。
  2. 数据结构设计不合理
    把names和state拆成两个ArrayList传递,耦合性高,容易出现数据下标不匹配的问题;而且ArrayAdapter的泛型用String完全没必要,因为你需要绑定两组关联数据。
  3. 布局加载方式错误
    inflate(R.layout.item, null)会忽略item布局中设置的LayoutParams,导致item的宽高、间距等样式失效,正确的做法是传入parent并设第三个参数为false。

二、优化后的ArrayAdapter代码

先定义数据类封装每组关联数据:

data class ItemData(val name: String, val state: String)

再重写优化后的Adapter:

class CustomAdapter(
    context: Context,
    private val itemList: List<ItemData>
) : ArrayAdapter<ItemData>(context, R.layout.item, itemList) {

    // ViewHolder复用类
    private class ViewHolder {
        lateinit var ivIcon: ImageView
        lateinit var tvName: TextView
        lateinit var tvState: TextView
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val viewHolder: ViewHolder
        val view: View

        if (convertView == null) {
            // 首次加载时创建View和ViewHolder
            view = LayoutInflater.from(context).inflate(R.layout.item, parent, false)
            viewHolder = ViewHolder()
            viewHolder.ivIcon = view.findViewById(R.id.imageView2)
            viewHolder.tvName = view.findViewById(R.id.textView10)
            viewHolder.tvState = view.findViewById(R.id.textView12)
            view.tag = viewHolder // 将ViewHolder存储到View的tag中
        } else {
            // 复用已有的View和ViewHolder
            view = convertView
            viewHolder = view.tag as ViewHolder
        }

        // 绑定数据
        val currentItem = itemList[position]
        viewHolder.ivIcon.setImageResource(R.drawable.ic_launcher_background)
        viewHolder.tvName.text = currentItem.name
        viewHolder.tvState.text = currentItem.state

        return view
    }
}

三、Kotlin创建Adapter的标准流程(推荐用RecyclerView)

ListView已逐渐被RecyclerView取代,下面是创建RecyclerView.Adapter的步骤:

  1. 定义数据类(和上面的ItemData一致)
  2. 创建ViewHolder类
class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val ivIcon: ImageView = itemView.findViewById(R.id.imageView2)
    val tvName: TextView = itemView.findViewById(R.id.textView10)
    val tvState: TextView = itemView.findViewById(R.id.textView12)
}
  1. 编写Adapter类
class RecyclerViewAdapter(private val itemList: List<ItemData>) :
    RecyclerView.Adapter<ItemViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item, parent, false)
        return ItemViewHolder(view)
    }

    override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
        val item = itemList[position]
        holder.ivIcon.setImageResource(R.drawable.ic_launcher_background)
        holder.tvName.text = item.name
        holder.tvState.text = item.state
    }

    override fun getItemCount(): Int = itemList.size
}
  1. 在页面中绑定RecyclerView
// 初始化RecyclerView
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = RecyclerViewAdapter(itemDataList)

四、创建Adapter文件的操作步骤

在Android Studio中:

  • 右键点击目标包 → New → Kotlin Class/File
  • 选择Class,输入Adapter名称(比如CustomAdapter)
  • 按上述代码结构编写即可

内容的提问来源于stack exchange,提问作者Abdallah moe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:42:55