CloudFog API Gateway

Limited Time

200+ AI Models Integration Hub

Claim Offer Now
Resolvedandroid

Kotlin 初学者求助:如何修复 Android 应用中 RecyclerView 和 SearchView 的搜索功能?🔍

技术控Alex

1/12/2025

79 views2 likes

嘿,大家好!👋

我最近在做我的第一个 Android 应用,结果被 RecyclerView 和 SearchView 搞得有点崩溃。😅 我已经能成功加载手机联系人到 RecyclerView 里了,但搜索功能就是不太对劲。看了好多视频教程,还是没搞定。有没有大佬能帮我看看我的代码哪里出问题了?🙏

这是我的 MainActivity 代码:

class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks { // ... existing code ... override fun onCreate(savedInstanceState: Bundle?) { // ... existing code ... searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { return false } override fun onQueryTextChange(newText: String?): Boolean { filterList(newText) return true } }) } // search filter private fun filterList(query: String?) { if (query != null) { val filteredList = ArrayList<ContactModel>() // 修正:创建一个新的 ArrayList for (i in mList) { if (i.contname.lowercase(Locale.ROOT).contains(query.lowercase(Locale.ROOT))) { filteredList.add(i) } } if (filteredList.isEmpty()) { Toast.makeText(this, "No Contact found!", Toast.LENGTH_SHORT).show() } else { adapter.setFilteredList(filteredList) // 修正:传递 filteredList } } } // ... existing code ... }

这是我的 RCVAdapter 代码:

class RCVAdapter(var contactList: ArrayList<ContactModel>) : RecyclerView.Adapter<RCVAdapter.MyViewHolder>() { // ... existing code ... fun setFilteredList(contactList: List<ContactModel>) { this.contactList.clear() // 修正:清空当前列表 this.contactList.addAll(contactList) // 修正:添加新的过滤列表 notifyDataSetChanged() } }

我发现的问题是,filterList 方法中我没有正确地创建和使用 filteredList,导致搜索结果不正确。😓

PS: 我是从 VB.NET 转过来的,对 Kotlin 还在摸索中,真心希望能尽快搞定这个问题!谢谢大家的帮助!🙏

如果有其他建议或者优化的地方,也请不吝赐教!✨

标签:Android、Kotlin、RecyclerView、SearchView

1 Answers

开发者小李

1/12/2025

Best Answer11

Answer #1 - Best Answer

嘿,你好啊!👋

我太理解你遇到的 RecyclerView 和 SearchView 的问题了——我之前也在这上面栽过跟头!😅 但别担心,我们一起来看看怎么解决这个问题。

首先,你的代码看起来已经很接近了,只需要一些小调整。让我来帮你理清思路。

解决方案

MainActivity 中,你已经正确地设置了 SearchView 的监听器,并在 filterList 方法中实现了过滤逻辑。这里有几个小地方需要注意:

  1. 创建和使用 filteredList:你已经在 filterList 方法中正确创建了一个新的 ArrayList,并在循环中添加符合条件的联系人。确保在 adapter.setFilteredList(filteredList) 之前,filteredList 已经包含了所有符合条件的联系人。

  2. 更新适配器:在 RCVAdapter 中,你已经实现了 setFilteredList 方法。确保在调用 notifyDataSetChanged() 之前,列表已经被正确更新。

以下是你的代码中需要注意的地方:

class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks { // ... existing code ... private fun filterList(query: String?) { if (query != null) { val filteredList = ArrayList<ContactModel>() // 创建一个新的 ArrayList for (i in mList) { if (i.contname.lowercase(Locale.ROOT).contains(query.lowercase(Locale.ROOT))) { filteredList.add(i) // 添加符合条件的联系人 } } if (filteredList.isEmpty()) { Toast.makeText(this, "No Contact found!", Toast.LENGTH_SHORT).show() } else { adapter.setFilteredList(filteredList) // 更新适配器 } } } // ... existing code ... }
class RCVAdapter(var contactList: ArrayList<ContactModel>) : RecyclerView.Adapter<RCVAdapter.MyViewHolder>() { // ... existing code ... fun setFilteredList(contactList: List<ContactModel>) { this.contactList.clear() // 清空当前列表 this.contactList.addAll(contactList) // 添加新的过滤列表 notifyDataSetChanged() // 通知适配器数据已更改 } }

个人经验提示

  • 调试技巧:在 filterList 方法中,可以使用 Log.d 打印 filteredList 的大小,帮助你确认过滤逻辑是否正确。

  • 常见错误:确保 mList 是你完整的联系人列表,而不是已经被过滤过的列表。

  • 性能优化:如果联系人列表很大,考虑在后台线程中执行过滤操作,以避免阻塞 UI 线程。

希望这些建议能帮到你!如果还有其他问题,随时问我哦!继续加油,你一定能搞定这个问题的!💪

如果需要进一步的帮助,别犹豫,随时联系我!✨

CloudFog API Gateway 🔥 New User Special

💥 New User Offer: Get $1 Credit for ¥0.5

Claim Offer Now