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

在Kotlin中实现输入“add new item”时向ListView添加项

实现ListView输入特定文本添加新项的Kotlin方案

问题背景

作为Kotlin和Android开发新手,现有以下布局文件:

主Activity布局(activity_main.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="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnControlButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Checking" />

    <ListView
        android:id="@+id/lvList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" />
</LinearLayout>

ListView项布局(list_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        tools:ignore="UselessParent">

        <CheckBox
            android:id="@+id/checkBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <EditText
            android:id="@+id/textInput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:autofillHints=""
            android:inputType="text"
            tools:ignore="LabelFor,RelativeOverlap" />
    </LinearLayout>
</RelativeLayout>

需求:当用户在任意列表项的输入框中输入add new item时,自动向ListView添加一个新的列表项。


解决方案

1. 定义数据类

创建数据类保存列表项的状态:

data class ListItem(
    var isChecked: Boolean = false,
    var inputText: String = ""
)

2. 自定义ListView适配器

实现BaseAdapter绑定数据与布局,并处理输入框文本监听:

class CustomListAdapter(
    private val context: Context,
    private val itemList: MutableList<ListItem>,
    private val onAddNewItem: () -> Unit
) : BaseAdapter() {

    override fun getCount(): Int = itemList.size

    override fun getItem(position: Int): ListItem = itemList[position]

    override fun getItemId(position: Int): Long = position.toLong()

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val view = convertView ?: LayoutInflater.from(context)
            .inflate(R.layout.list_item, parent, false)

        val checkBox = view.findViewById<CheckBox>(R.id.checkBox)
        val editText = view.findViewById<EditText>(R.id.textInput)
        val currentItem = getItem(position)

        // 绑定现有数据到视图
        checkBox.isChecked = currentItem.isChecked
        editText.setText(currentItem.inputText)

        // 监听复选框状态变化
        checkBox.setOnCheckedChangeListener { _, isChecked ->
            currentItem.isChecked = isChecked
        }

        // 监听输入框文本变化
        editText.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                currentItem.inputText = s.toString().trim()
                // 触发添加新项的条件判断
                if (currentItem.inputText.equals("add new item", ignoreCase = true)) {
                    onAddNewItem.invoke()
                    // 清空当前输入框,避免重复触发
                    editText.setText("")
                }
            }

            override fun afterTextChanged(s: Editable?) {}
        })

        return view
    }
}

3. 主Activity实现

初始化数据、适配器并设置ListView:

class MainActivity : AppCompatActivity() {

    private lateinit var lvList: ListView
    private lateinit var adapter: CustomListAdapter
    private val itemList = mutableListOf<ListItem>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lvList = findViewById(R.id.lvList)

        // 初始化至少一个列表项,提供输入入口
        itemList.add(ListItem())
        adapter = CustomListAdapter(this, itemList) {
            // 添加新项的逻辑
            itemList.add(ListItem())
            adapter.notifyDataSetChanged()
        }

        lvList.adapter = adapter

        // 原按钮的点击逻辑(可按需修改)
        findViewById<Button>(R.id.btnControlButton).setOnClickListener {
            itemList.forEachIndexed { index, item ->
                Log.d("MainActivity", "Item $index: checked=${item.isChecked}, text=${item.inputText}")
            }
        }
    }
}

关键说明

  • 数据类ListItem:统一管理每个列表项的复选框状态和输入文本,实现数据与视图的双向同步。
  • 输入监听逻辑:在适配器中为每个输入框添加文本监听,匹配触发文本后立即执行添加操作并清空输入框,防止重复触发。
  • 回调解耦:通过onAddNewItem回调将添加新项的逻辑移至Activity,符合单一职责原则。
  • 初始数据:必须初始化至少一个列表项,否则用户没有输入的入口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:14:56