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

Android API 19-23 RecyclerView筛选功能失效修复求助

RecyclerView筛选功能低版本适配修复

我的RecyclerView筛选功能在Android API 24及以上版本正常运行,但在API 19、20、21、22、23版本中无法正常工作。本人是Android Studio新手,仅掌握基础Java代码,尝试多日未解决,求修改代码使其兼容低版本系统。

问题原因

  1. 低版本筛选逻辑错误:在API低于24的分支中,每次匹配到符合条件的条目时都调用listaContactos.clear(),导致最终列表仅保留最后一个匹配项,而非所有符合条件的结果。
  2. 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);
                }
            });
        }
    }
}

说明

  1. 修正了低版本筛选逻辑:将listaContactos.clear()移到循环外,确保先清空列表,再添加所有符合条件的条目。
  2. 优化了LayoutInflater的使用:传入parent作为根布局参数,让Item布局继承RecyclerView的布局参数,避免低版本显示异常。
  3. 可选保留Stream API分支:如果想继续使用API24+的Stream特性,可启用注释中的代码,低版本分支已修正逻辑。
  4. MainActivity代码无需修改,保持原有逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:55:33