Android Filter仅匹配章节名才返回结果,低层级匹配失效问题
问题修复:Filter无法匹配Section/SubSection段落内容的问题
当前代码存在两个核心问题导致无法正确匹配Section或SubSection下的段落内容:
- 未检查Section自身的段落列表:原代码只判断了Section的名称和SubSection,忽略了Section直接包含的
paragraphList和cleanedParagraphs。 - 空列表处理不当:使用
?.any()后直接与true比较,当列表为null时会返回null,而null == true结果为false,可能导致合法匹配被忽略。
以下是修复后的完整Filter代码:
override fun getFilter(): Filter { return object : Filter() { override fun performFiltering(constraint: CharSequence?): FilterResults { val query = constraint.toString().lowercase() searchTextQuery = query val filteredData = if (query.isEmpty()) { originalList } else { originalList.filter { chapter -> // 匹配章节名称 chapter.name.lowercase().contains(query) || // 检查章节下的所有Section chapter.sectionList?.any { section -> // 匹配Section名称 section.name.lowercase().contains(query) || // 匹配Section直接包含的段落 section.paragraphList?.any { paragraph -> paragraph.name.lowercase().contains(query) } ?: false || // 匹配Section的cleanedParagraphs section.cleanedParagraphs?.any { paragraph -> paragraph.name.lowercase().contains(query) } ?: false || // 检查Section下的所有SubSection section.subsectionList?.any { subsection -> // 匹配SubSection名称 subsection.name.lowercase().contains(query) || // 匹配SubSection包含的段落 subsection.paragraphList?.any { paragraph -> paragraph.name.lowercase().contains(query) } ?: false || // 匹配SubSection的cleanedParagraphs subsection.cleanedParagraphs?.any { paragraph -> paragraph.name.lowercase().contains(query) } ?: false } ?: false } ?: false } } val results = FilterResults() results.values = filteredData return results } override fun publishResults(constraint: CharSequence?, results: FilterResults?) { if (results != null && results.values is List<*>) { filteredList = results.values as List<Chapter> notifyDataSetChanged() } } } }
关键修复点说明:
- 新增Section段落检查:在Section的判断逻辑中,添加了对
paragraphList和cleanedParagraphs的匹配检查。 - 新增SubSection的cleanedParagraphs检查:补充了对SubSection下
cleanedParagraphs的匹配判断。 - 空列表安全处理:使用
?: false替代== true,当列表为null时自动视为不匹配,避免空值比较导致的逻辑错误。 - 层级覆盖完整:现在会依次检查章节名、Section名、Section段落、SubSection名、SubSection段落的所有匹配可能性。
内容的提问来源于stack exchange,提问作者Michael Phandera
相关产品推荐
相关产品推荐

