Android API 19-23 RecyclerView筛选功能失效修复求助
RecyclerView筛选功能低版本适配修复
我的RecyclerView筛选功能在Android API 24及以上版本正常运行,但在API 19、20、21、22、23版本中无法正常工作。本人是Android Studio新手,仅掌握基础Java代码,尝试多日未解决,求修改代码使其兼容低版本系统。
问题原因
- 低版本筛选逻辑错误:在API低于24的分支中,每次匹配到符合条件的条目时都调用
listaContactos.clear(),导致最终列表仅保留最后一个匹配项,而非所有符合条件的结果。 - LayoutInflater使用不当:用
null作为根布局参数,在低版本系统中可能导致Item布局的宽高参数失效,影响列表显示。
修改后的完整MyAdapter代码
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { ArrayList<User> listaContactos; ArrayList<User> listaOriginal; public MyAdapter(ArrayList<User> listaContactos) { this.listaContactos = listaContactos; listaOriginal = new ArrayList<>(); listaOriginal.addAll(listaContactos); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 修正LayoutInflater的根布局参数,避免低版本布局异常 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.lista_item_contacto, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.viewNombre.setText(listaContactos.get(position).getNombre()); holder.viewTelefono.setText(listaContactos.get(position).getTelefono()); holder.viewCorreo.setText(listaContactos.get(position).getCorreo_electornico()); } public void filtrado(final String txtBuscar) { int longitud = txtBuscar.length(); if (longitud == 0) { listaContactos.clear(); listaContactos.addAll(listaOriginal); } else { // 先清空列表,再添加所有匹配项,高低版本统一逻辑 listaContactos.clear(); String lowerCaseQuery = txtBuscar.toLowerCase(); for (User c : listaOriginal) { if (c.getNombre().toLowerCase().contains(lowerCaseQuery)) { listaContactos.add(c); } } // 若需保留API24+的Stream特性,可启用以下注释代码 /* if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { List<User> collection = listaOriginal.stream() .filter(i -> i.getNombre().toLowerCase().contains(lowerCaseQuery)) .collect(Collectors.toList()); listaContactos.clear(); listaContactos.addAll(collection); } else { listaContactos.clear(); for (User c : listaOriginal) { if (c.getNombre().toLowerCase().contains(lowerCaseQuery)) { listaContactos.add(c); } } } */ } notifyDataSetChanged(); } @Override public int getItemCount() { return listaContactos.size(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView viewNombre, viewTelefono, viewCorreo; public ViewHolder(@NonNull View itemView) { super(itemView); viewNombre = itemView.findViewById(R.id.viewNombre); viewTelefono = itemView.findViewById(R.id.viewTelefono); viewCorreo = itemView.findViewById(R.id.viewCorreo); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Context context = view.getContext(); Intent intent = new Intent(context, VerActivity.class); intent.putExtra("ID", listaContactos.get(getAdapterPosition()).getID()); context.startActivity(intent); } }); } } }
说明
- 修正了低版本筛选逻辑:将
listaContactos.clear()移到循环外,确保先清空列表,再添加所有符合条件的条目。 - 优化了LayoutInflater的使用:传入parent作为根布局参数,让Item布局继承RecyclerView的布局参数,避免低版本显示异常。
- 可选保留Stream API分支:如果想继续使用API24+的Stream特性,可启用注释中的代码,低版本分支已修正逻辑。
- MainActivity代码无需修改,保持原有逻辑即可。
内容的提问来源于stack exchange,提问作者tranxzzano
相关产品推荐
相关产品推荐

