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

如何用RecyclerView实现可动态添加/删除的用户输入列表?功能异常排查

问题修复方案

你的代码存在几个关键问题,导致点击输入法IME_ACTION_DONE按钮后无法新增列表项,以下是具体修复点:

1. 修正notifyItemInserted的参数

调用checkListItems.add("")后,新元素的索引是checkListItems.size - 1(集合索引从0开始),而非checkListItems.size。原写法会让RecyclerView找不到对应位置,无法触发视图插入。

修改后的监听逻辑:

holder.binding.checkListEt.setOnEditorActionListener { v, actionId, event ->
    if (actionId == EditorInfo.IME_ACTION_DONE){
        checkListItems.add("")
        // 插入位置为新增元素的索引:size-1
        notifyItemInserted(checkListItems.size - 1)
        
        // 可选:让新的EditText自动获取焦点,提升输入体验
        holder.binding.root.post {
            val newHolder = recyclerView.findViewHolderForAdapterPosition(checkListItems.size - 1) as? ViewHolder
            newHolder?.binding?.checkListEt?.apply {
                requestFocus()
                setSelection(0)
            }
        }
    }
    // 仅匹配DONE动作时返回true,避免拦截其他输入法事件
    actionId == EditorInfo.IME_ACTION_DONE
}

2. 确保布局中EditText配置正确imeOptions

检查check_list_item.xml布局文件,给EditText添加imeOptions="actionDone",否则输入法不会显示Done按钮:

<EditText
    android:id="@+id/checkListEt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"
    android:inputType="text" />

3. 优化文本监听逻辑(可选)

addTextChangedListener中的position < checkListItems.size判断多余(Adapter传入的position必然是有效索引),可简化为:

holder.binding.checkListEt.addTextChangedListener { text: Editable? ->
    checkListItems[position] = text?.toString() ?: ""
}

完整修复后的Adapter代码

import android.text.Editable
import android.view.LayoutInflater
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import androidx.core.widget.addTextChangedListener
import androidx.recyclerview.widget.RecyclerView
import com.app.dynamicrv.databinding.CheckListItemBinding

class CheckListAdapter(
    private val recyclerView: RecyclerView // 新增参数,用于获取新ViewHolder并请求焦点
) : RecyclerView.Adapter<CheckListAdapter.ViewHolder>() {

    private val checkListItems = arrayListOf("")

    inner class ViewHolder(val binding: CheckListItemBinding) :
        RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            CheckListItemBinding.inflate(
                LayoutInflater.from(parent.context),
                parent, false
            )
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = checkListItems[position]
        holder.binding.checkListEt.setText(item)

        holder.binding.checkListEt.addTextChangedListener { text: Editable? ->
            checkListItems[position] = text?.toString() ?: ""
        }

        holder.binding.checkListEt.setOnEditorActionListener { v, actionId, event ->
            if (actionId == EditorInfo.IME_ACTION_DONE){
                checkListItems.add("")
                notifyItemInserted(checkListItems.size - 1)
                
                holder.binding.root.post {
                    val newHolder = recyclerView.findViewHolderForAdapterPosition(checkListItems.size - 1) as? ViewHolder
                    newHolder?.binding?.checkListEt?.apply {
                        requestFocus()
                        setSelection(0)
                    }
                }
            }
            actionId == EditorInfo.IME_ACTION_DONE
        }
    }

    override fun getItemCount() = checkListItems.size

    fun getListItems(): List<String> {
        return checkListItems
    }
}

使用时需传入RecyclerView实例,例如在Activity/Fragment中:

val adapter = CheckListAdapter(recyclerView)
recyclerView.adapter = adapter

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:04:55