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

如何优化给定的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:21:58