如何用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
相关产品推荐
相关产品推荐

