RecyclerView适配器Filter的publishResults方法出现Unchecked assignment警告如何解决
问题原因
FilterResults类的values字段是Object类型,你直接将其强转为无泛型的原生List后赋值给List<Investor>类型的集合时,编译器无法验证该列表内的元素是否为Investor类型,因此抛出未检查赋值警告。- 附加问题提示:你当前的过滤逻辑存在重复添加同一条数据的问题:如果某个投资者的用户名和注册时间同时命中搜索关键词,会被两次添加到过滤列表中,建议将两个
if判断合并为||逻辑。
解决方法
方案1:增加类型校验(更安全,无警告)
在publishResults方法中先做类型合法性校验,再逐个转换元素,完全规避类型转换风险,修改后的代码如下:
@Override protected void publishResults(CharSequence constraint, FilterResults filterResults) { investorList.clear(); if (filterResults.values instanceof List<?>) { List<?> resultList = (List<?>) filterResults.values; for (Object item : resultList) { if (item instanceof Investor) { investorList.add((Investor) item); } } } notifyDataSetChanged(); }
方案2:添加忽略警告注解(代码更简洁,适合确定类型绝对安全的场景)
由于你的performFiltering方法中明确返回的是List<Investor>类型的结果,可以确认类型不会出错,因此可以直接添加@SuppressWarnings注解忽略该警告,修改后的代码如下:
@Override @SuppressWarnings("unchecked") protected void publishResults(CharSequence constraint, FilterResults filterResults) { investorList.clear(); investorList.addAll((List<Investor>) filterResults.values); notifyDataSetChanged(); }
注意:使用该方案时需要确保performFiltering中给filterResults.values赋值的永远是List<Investor>类型,避免运行时出现类型转换异常
过滤逻辑优化建议
你可以将performFiltering中的循环判断逻辑修改为如下代码,避免重复添加数据:
for (Investor investor : investorListFull) { if (investor.getUsername().toLowerCase().contains(filterPattern) || investor.getDateJoined().toLowerCase().contains(filterPattern)) { filteredList.add(investor); } }
内容的提问来源于stack exchange,提问作者Emmanuel Njorodongo
相关产品推荐
相关产品推荐

