技术控Alex
1/12/2025
嘿,大家好!👋
我最近在做我的第一个 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/12/2025
嘿,你好啊!👋
我太理解你遇到的 RecyclerView 和 SearchView 的问题了——我之前也在这上面栽过跟头!😅 但别担心,我们一起来看看怎么解决这个问题。
首先,你的代码看起来已经很接近了,只需要一些小调整。让我来帮你理清思路。
在 MainActivity
中,你已经正确地设置了 SearchView
的监听器,并在 filterList
方法中实现了过滤逻辑。这里有几个小地方需要注意:
创建和使用 filteredList
:你已经在 filterList
方法中正确创建了一个新的 ArrayList
,并在循环中添加符合条件的联系人。确保在 adapter.setFilteredList(filteredList)
之前,filteredList
已经包含了所有符合条件的联系人。
更新适配器:在 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 线程。
希望这些建议能帮到你!如果还有其他问题,随时问我哦!继续加油,你一定能搞定这个问题的!💪
如果需要进一步的帮助,别犹豫,随时联系我!✨