如何优化给定的Kotlin Android任务列表页面代码?
Kotlin Android 代码优化与注释版本
优化说明
- 修正命名规范,对齐Kotlin/Android开发标准
- 重构数据源逻辑,避免重复过滤操作,提升性能
- 实现ViewHolder模式,优化ListView视图复用效率
- 批量更新数据后统一通知适配器,减少UI刷新次数
- 消除不安全的类型转换和非空断言
- 替换硬编码内容为资源引用(需在res目录对应文件配置)
- 移除无意义的代码逻辑
package com.linecorp.exam import android.os.Bundle import android.widget.TextView import android.app.Activity import android.graphics.Color import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ListView class MainActivity : Activity() { // 任务状态枚举,遵循大驼峰命名规范 enum class TaskState { TODO, DONE } // 原始任务数据列表 private val taskList = mutableListOf<Pair<String, TaskState>>() // 排序后任务列表:TODO任务在前,DONE任务在后 private val sortedTaskList = mutableListOf<Pair<String, TaskState>>() private lateinit var taskAdapter: TaskAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化适配器并绑定到ListView taskAdapter = TaskAdapter() val listView = findViewById<ListView>(R.id.list_view) listView.adapter = taskAdapter // 加载并初始化任务数据 loadTasks() } /** * 从仓库加载任务数据,处理后更新UI */ private fun loadTasks() { taskList.clear() // 批量添加所有任务数据 taskList.addAll(todoRepository.instance.fetch_all()) // 更新排序后的任务列表 refreshSortedTaskList() // 统一通知适配器数据更新 taskAdapter.notifyDataSetChanged() } /** * 重新排序任务列表,确保TODO任务优先展示 */ private fun refreshSortedTaskList() { sortedTaskList.clear() sortedTaskList.addAll(taskList.filter { it.second == TaskState.TODO }) sortedTaskList.addAll(taskList.filter { it.second == TaskState.DONE }) } /** * 任务列表适配器,实现ViewHolder模式提升复用效率 */ inner class TaskAdapter : BaseAdapter() { // 返回排序后任务列表的数量 override fun getCount(): Int = sortedTaskList.size // 返回指定位置的任务数据,直接返回具体类型避免类型转换 override fun getItem(position: Int): Pair<String, TaskState> = sortedTaskList[position] // 使用position作为条目的唯一ID override fun getItemId(position: Int): Long = position.toLong() override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val viewHolder: ViewHolder val itemView = if (convertView == null) { // 首次创建视图,初始化ViewHolder缓存控件 val inflater = layoutInflater val view = inflater.inflate(R.layout.list_item, parent, false) viewHolder = ViewHolder(view) view.tag = viewHolder view } else { // 复用已有视图,直接取出缓存的ViewHolder viewHolder = convertView.tag as ViewHolder convertView } // 获取当前位置的任务数据并更新UI val task = getItem(position) viewHolder.apply { when (task.second) { TaskState.TODO -> { labelTv.text = getString(R.string.todo_label) labelTv.setBackgroundColor(Color.YELLOW) } TaskState.DONE -> { labelTv.text = getString(R.string.done_label) labelTv.setBackgroundColor(Color.TRANSPARENT) } } contentTv.text = task.first } return itemView } /** * ViewHolder类,缓存列表项中的控件,避免重复调用findViewById */ inner class ViewHolder(itemView: View) { val labelTv: TextView = itemView.findViewById(R.id.item_label) val contentTv: TextView = itemView.findViewById(R.id.item_text) } } }
补充配置
需在res/values/strings.xml中添加对应字符串资源:
<string name="todo_label">TODO</string> <string name="done_label">DONE</string>
内容的提问来源于stack exchange,提问作者user15369973
相关产品推荐
相关产品推荐

