TextWatcher自动补全仅首个输入字符生效,后续无响应问题求助
问题分析与解决
嘿,我一眼就瞅出问题在哪儿了!你的代码在用户第一次输入时能正常过滤标签,但后续输入没更新建议列表,核心原因是每次输入新内容时,你没有先清空适配器里已有的旧标签,而是直接追加新的过滤结果。
举个例子:当用户输入"J"时,适配器里会加入"John Smith"、"Jesse Albright";接着用户输入"Jo",你又把"John Smith"加进去,此时适配器里其实有三个条目(两个John+一个Jesse),但RecyclerView显示的还是旧的列表,看起来就像没更新一样。
修改后的代码
val tags = listOf( "John Smith", "Kate Eckhart", "Emily Sun", "Frodo Baggins", "Yanay Zabary", "Sze Lok Ho", "Jesse Albright", "Shayna something", "Makena Lawrence" ) questionTagsInput.addTextChangedListener(object : TextWatcher { override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val userInput = s.toString() if (userInput.isEmpty()) { tagSuggestionRecycler.visibility = View.GONE tagsFiltredAdapter.clear() } else { // 先清空适配器里的旧内容!这是关键 tagsFiltredAdapter.clear() val relevantTags: List<String> = tags.filter { it.contains(userInput, ignoreCase = true) } // 加忽略大小写参数,体验更友好 if (relevantTags.isNotEmpty()) { tagSuggestionRecycler.visibility = View.VISIBLE relevantTags.forEach { tag -> tagsFiltredAdapter.add(SingleTagSuggestion(tag)) } } else { // 无匹配标签时隐藏列表 tagSuggestionRecycler.visibility = View.GONE } } } override fun afterTextChanged(s: Editable?) { } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } })
关键修改点说明
- 每次过滤前清空适配器:在
else分支开头先调用tagsFiltredAdapter.clear(),确保旧标签被完全移除,只保留当前输入对应的新结果。 - 优化可见性逻辑:把设置RecyclerView可见性的代码移到循环外,同时判断过滤后的列表是否为空,无匹配项时也隐藏列表,交互更连贯。
- 可选体验优化:在
contains方法中加入ignoreCase = true,让用户输入小写也能匹配大写开头的标签,提升使用体验。
这样修改后,用户每输入一个字符,适配器都会先清空旧内容再添加新的过滤结果,RecyclerView就能实时更新显示正确的标签建议啦!
内容的提问来源于stack exchange,提问作者Tsabary
相关产品推荐
相关产品推荐

