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

Android ListView添加条目搜索功能:基于现有Kotlin代码的实现方案咨询

实现ListView睡眠数据搜索功能的步骤

1. 先在activity_sleep.xml布局中添加搜索控件

在ListView上方加入SearchView搜索框:

<SearchView
    android:id="@+id/searchViewSleep"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:queryHint="搜索睡眠相关条目"/>
<ListView
    android:id="@+id/lvsleep"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

2. 修改SleepAdapter适配器,实现Filterable过滤接口

修改后的适配器代码如下,新增原始全量数据存储、过滤逻辑,同时优化了原有条目复用和点击事件的索引正确性:

class SleepAdapter(context: Sleep, private val originalList: ArrayList<ModleSleep>) : ArrayAdapter<ModleSleep>(context, 0, originalList), Filterable {

    // 存储当前展示的过滤后数据,默认和全量数据一致
    private val filteredList = ArrayList(originalList)

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

    override fun getItem(position: Int): ModleSleep? {
        return filteredList[position]
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        // 复用已有视图,提升列表滑动性能
        val itemView = convertView ?: LayoutInflater.from(context).inflate(R.layout.list_sleep, parent, false)
        val currentItem = filteredList[position]
        itemView.tvsleep.text = currentItem.name3
        itemView.Sdescription.text = currentItem.des3
        itemView.onclicksleep.setOnClickListener {
            val intent = Intent(context, onclicksleep::class.java)
            intent.putExtra("dessleep", currentItem.des3)
            context.startActivity(intent)
        }
        return itemView
    }

    override fun getFilter(): Filter {
        return object : Filter() {
            // 后台线程执行过滤逻辑
            override fun performFiltering(constraint: CharSequence?): FilterResults {
                val searchContent = constraint.toString().trim().lowercase()
                val filterResult = FilterResults()
                filterResult.values = if (searchContent.isEmpty()) {
                    // 搜索内容为空时返回全部数据
                    originalList
                } else {
                    // 过滤规则:名称或描述包含搜索内容则保留,不需要匹配描述可删掉||后的逻辑即可
                    originalList.filter {
                        it.name3.lowercase().contains(searchContent) || it.des3.lowercase().contains(searchContent)
                    }
                }
                return filterResult
            }

            // 主线程更新过滤后的列表
            @Suppress("UNCHECKED_CAST")
            override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
                filteredList.clear()
                filteredList.addAll(results?.values as ArrayList<ModleSleep>)
                notifyDataSetChanged()
            }
        }
    }
}

3. 修改Sleep Activity类,绑定搜索框监听

修改后的Activity代码如下:

class Sleep : AppCompatActivity() {
    private val listofsleep = ArrayList<ModleSleep>()
    // 适配器声明为成员变量,方便调用过滤方法
    private lateinit var adaptersleep: SleepAdapter

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

        // 先初始化全量数据
        listofsleep.add(ModleSleep(getString(R.string.SleepAnalysis), getString(R.string.SleepAnalysisDes)))
        listofsleep.add(ModleSleep(getString(R.string.SleepAnalysis), getString(R.string.SleepAnalysisDes)))
        listofsleep.add(ModleSleep(getString(R.string.SleepAnalysis), getString(R.string.SleepAnalysisDes)))
        listofsleep.add(ModleSleep(getString(R.string.SleepAnalysis), getString(R.string.SleepAnalysisDes)))
        listofsleep.add(ModleSleep(getString(R.string.SleepAnalysis), getString(R.string.SleepAnalysisDes)))

        adaptersleep = SleepAdapter(this, listofsleep)
        lvsleep.adapter = adaptersleep

        // 绑定搜索框文本变化监听
        searchViewSleep.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            // 点击搜索按钮时触发
            override fun onQueryTextSubmit(query: String?): Boolean {
                adaptersleep.filter.filter(query)
                return true
            }
            // 输入内容实时变化时触发
            override fun onQueryTextChange(newText: String?): Boolean {
                adaptersleep.filter.filter(newText)
                return true
            }
        })
        // 可选配置:设置搜索框默认展开
        searchViewSleep.isIconifiedByDefault = false
    }
}

内容的提问来源于stack exchange,提问作者Sabah Hussein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:54:02