首页 > 解决方案 > 实现搜索过滤器在按下退格键时导致问题

问题描述

当我Edit text第一次输入时,我试图在 recyclerview 中对复杂对象数据实施搜索过滤器,它可以正常工作,但是每当我尝试通过按退格键删除字符以修改我们的搜索时 - 我反复失败对此。我只能搜索一次!! 在此处输入图像描述

        etSearch = (EditText) findViewById(R.id.edittext);

    etSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
                myAdapter.filter(s);

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

现在是过滤器代码

    public void filter(CharSequence sequence) {
    ArrayList<user> temp = new ArrayList<>();
        if (!TextUtils.isEmpty(sequence)) {
            for (user s : arr) {
                Log.d("users ",s.getName());
                if (s.getName().toLowerCase().contains(sequence)) {
                    temp.add(s);
                }
            }

        } else {
            temp.addAll(arrcopy);
        }
        arr.clear();
        arr.addAll(temp);
        notifyDataSetChanged();
        temp.clear();

}

什么问题,我不能搜索不止一次 - 任何帮助表示赞赏

这是我的适配器类

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder>
{
    Context cxt;
    ArrayList<user> arr;
    ArrayList<user> arrcopy;
    DatabaseReference dref;
    MyAdapter myAdapter;
    public MyAdapter(Context context, ArrayList<user> arrayList)
    {
        cxt = context;
        arr = arrayList;
        arrcopy=new ArrayList<>(arr);
        Log.d("Very start arr",arr.toString());
        notifyDataSetChanged();
        dref = FirebaseDatabase.getInstance().getReference("users");
    }


    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(cxt).inflate(R.layout.item_chatroom,viewGroup,false);
        myAdapter = new MyAdapter(cxt, arr);
        Log.d("Inside MyHolder arr",arr.toString());
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyHolder myHolder,final int i) {

        final String name = arr.get(i).getUsername();
        String pic=arr.get(i).getPic();
        final String mail=arr.get(i).getEmail();
        myHolder.name.setText(name);



        Glide.with(myHolder.profile.getContext())
                .load(pic)
                .into(myHolder.profile);

        myHolder.name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(cxt,MainActivity.class);
                intent.putExtra("Id",arr.get(i).getId());
                intent.putExtra("Name",arr.get(i).getUsername());
                cxt.startActivity(intent);
            }
        });

        myHolder.info.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final SweetAlertDialog pDialog = new SweetAlertDialog(cxt, SweetAlertDialog.SUCCESS_TYPE);
                pDialog.setTitleText("User Information e-mail ID");
                pDialog.setContentText("Name: "+name+"\n\n E-mail: "+mail);
                pDialog.setConfirmText("Ok");
                pDialog.show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return arr.size();
    }

    class MyHolder extends RecyclerView.ViewHolder
    {
        TextView name;
        ImageView profile,info;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.txv);
            profile=itemView.findViewById(R.id.profile);
            info=itemView.findViewById(R.id.profileinfo);
        }
    }

    public void filter(CharSequence sequence) {

        ArrayList<user> temp = new ArrayList<>();
            if (!TextUtils.isEmpty(sequence)) {
                for (user s : arr) {
                    if (s.getName().toLowerCase().contains(sequence)) {
                        temp.add(s);
                    }
                }

            } else {
                temp.addAll(arrcopy);

            }
            arr.clear();
            arr.addAll(temp);

            notifyDataSetChanged();
            temp.clear();

    }

}

标签: androidandroid-recyclerviewandroid-adapter

解决方案


我假设 arrcopy 是 arr 的副本,例如:

ArrayList<User> arrcopy = new ArrayList<>(arr);

如果你修改 arr,它也会改变 arrcopy 的内容。当没有结果匹配时,arr 为空,arrcopy 也是。

else {
    temp.addAll(arrcopy);
}
arr.clear();
arr.addAll(temp);

现在 temp 为空,您为适配器设置的 arr 数据为空,因此出现问题。请尝试:
在 MyAdapter 中:

Context cxt;
ArrayList<user> arr;
public MyAdapter(Context context) {
    cxt = context;
    dref = FirebaseDatabase.getInstance().getReference("users");
}

public void setData(ArrayList<User> arrayList) {
    arr = arrayList;
    notifyDataSetChanged();
}

还将 filter() 放入您的活动/片段中:

protected void onCreate(final Bundle savedInstanceState) {
    etSearch = (EditText) findViewById(R.id.edittext);
    etSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            etSearch.requestFocus();
        }
    });
    etSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
                filter(etSearch.getText().toString());
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    etSearch.clearFocus();

    mAdapter = new MyAdapter(this);
    mAdapter.setData(arrayList);
    mRecyclerView.setAdapter(mAdapter);
    ...
}

public void filter(String input) {
    if (!TextUtils.isEmpty(input)) {
        ArrayList<User> temp = new ArrayList<>();
        for (user s : arr) {
            if (s.getName().toLowerCase().contains(input)) {
                temp.add(s);
            }
        }
        mAdapter.setData(temp);
    } else {
        mAdapter.setData(arr);
    }
    mAdapter.notifyDataSetChanged();
}

推荐阅读