如何用Kotlin创建Adapter文件?旧教程中的Adapter代码是否正确?
你的Kotlin Adapter代码问题分析与正确创建方法
一、现有代码的问题
你的代码能正常运行,但存在三个核心问题,会影响列表性能和可维护性:
- 未复用ConvertView,性能极差
每次调用getView都重新inflate布局,列表滚动时会频繁创建销毁View,导致卡顿、内存占用飙升,这是ListView Adapter的典型错误。 - 数据结构设计不合理
把names和state拆成两个ArrayList传递,耦合性高,容易出现数据下标不匹配的问题;而且ArrayAdapter的泛型用String完全没必要,因为你需要绑定两组关联数据。 - 布局加载方式错误
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的步骤:
- 定义数据类(和上面的
ItemData一致) - 创建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) }
- 编写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 }
- 在页面中绑定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
相关产品推荐
相关产品推荐

