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
相关产品推荐
相关产品推荐

