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

Kotlin中ListView联系人列表的EditText筛选实现求助

嘿,我来帮你搞定这个联系人筛选的问题!其实实现EditText实时筛选ListView里的联系人,核心思路就是维护原始完整数据和筛选后展示数据两份列表,配合EditText的输入监听来动态更新展示内容,下面是完整的解决方案:

实现EditText联系人筛选的完整方案

步骤1:改造自定义适配器,支持动态更新数据

首先调整你的ContactsAdapter,让它能接收原始数据和筛选后的数据,同时提供更新展示列表的方法:

class ContactsAdapter(
    private val context: Context,
    // 存储原始完整的联系人列表,用于筛选匹配
    private val originalContacts: ArrayList<ContactModel>,
    // 当前ListView展示的筛选后列表
    private var filteredContacts: ArrayList<ContactModel>
) : BaseAdapter() {

    // 提供更新筛选数据的方法,更新后通知ListView刷新
    fun updateFilteredData(newFilteredList: ArrayList<ContactModel>) {
        filteredContacts = newFilteredList
        notifyDataSetChanged()
    }

    override fun getCount(): Int {
        return filteredContacts.size
    }

    override fun getItem(position: Int): ContactModel {
        return filteredContacts[position]
    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    // 保留你原有的getView实现逻辑
    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        // ... 你的原有布局加载、数据绑定代码
    }

    // 保留你原有的getViewTypeCount和getItemViewType逻辑
    override fun getViewTypeCount(): Int {
        return count
    }

    override fun getItemViewType(position: Int): Int {
        // ... 你的原有类型判断逻辑
    }
}

步骤2:在界面中绑定EditText的输入监听

在你的Activity/Fragment里,初始化适配器并给EditText添加TextWatcher,实时响应输入变化来执行筛选:

class ContactsActivity : AppCompatActivity() {
    private lateinit var etSearch: EditText
    private lateinit var listView: ListView
    private lateinit var adapter: ContactsAdapter
    private lateinit var originalContactList: ArrayList<ContactModel>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_contacts)

        // 初始化控件
        etSearch = findViewById(R.id.et_search)
        listView = findViewById(R.id.list_view)

        // 这里替换成你获取联系人列表的逻辑
        originalContactList = fetchContactList()

        // 初始化适配器,默认展示全部联系人
        adapter = ContactsAdapter(this, originalContactList, ArrayList(originalContactList))
        listView.adapter = adapter

        // 给EditText添加输入监听
        etSearch.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                // 输入变化时立刻执行筛选
                filterContacts(s.toString())
            }

            override fun afterTextChanged(s: Editable?) {}
        })
    }

    // 核心筛选逻辑:根据输入关键词匹配联系人(可根据你的需求调整匹配规则)
    private fun filterContacts(keyword: String) {
        val filteredList = ArrayList<ContactModel>()
        if (keyword.isEmpty()) {
            // 关键词为空时展示全部联系人
            filteredList.addAll(originalContactList)
        } else {
            val lowerKeyword = keyword.lowercase(Locale.getDefault())
            for (contact in originalContactList) {
                // 假设ContactModel有name和phone字段,匹配姓名或手机号(根据你的实际字段调整)
                val nameMatch = contact.name.lowercase(Locale.getDefault()).contains(lowerKeyword)
                val phoneMatch = contact.phone.lowercase(Locale.getDefault()).contains(lowerKeyword)
                if (nameMatch || phoneMatch) {
                    filteredList.add(contact)
                }
            }
        }
        // 更新适配器的展示数据
        adapter.updateFilteredData(filteredList)
    }

    // 你的联系人列表获取方法
    private fun fetchContactList(): ArrayList<ContactModel> {
        // ... 原有获取联系人的逻辑
    }
}

可选优化点

  • 性能优化:如果联系人数量极多,可以把筛选逻辑放到异步线程中执行,避免UI卡顿,筛选完成后在主线程更新适配器。
  • 输入防抖:添加500ms左右的延迟执行筛选,避免每输入一个字符就触发一次筛选,减少不必要的计算。
  • 匹配规则扩展:可以根据需求实现开头匹配、全词匹配,甚至拼音首字母匹配等更灵活的筛选逻辑。

这样就能实现实时的联系人筛选功能啦,核心就是通过TextWatcher监听输入,从原始数据中筛选出符合条件的内容,再通知适配器更新展示列表。

内容的提问来源于stack exchange,提问作者Jorge Riveiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:43:06