在Android RecyclerView ArrayList中搜索
我正在尝试为我的recyclerView实现一个搜索选项,用户可以在其中键入引用。但每次我在“搜索”视图中键入字符时,我的arrayList都会重复,即使我尝试清除它,它也不会起作用: 这是最初的看法: 这就是搜索错误 这是我的搜索代码在Android RecyclerView ArrayList中搜索,android,search,android-recyclerview,Android,Search,Android Recyclerview,我正在尝试为我的recyclerView实现一个搜索选项,用户可以在其中键入引用。但每次我在“搜索”视图中键入字符时,我的arrayList都会重复,即使我尝试清除它,它也不会起作用: 这是最初的看法: 这就是搜索错误 这是我的搜索代码 searchOnd.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQuery
searchOnd.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
query.toLowerCase();
filtredList.clear();
for (Onduleur al:pvList){
if(al.getReference().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
if(filtredList.isEmpty()) {
layInver.setVisibility(View.GONE);
notfound.setVisibility(View.VISIBLE);
backSearch.setVisibility(View.VISIBLE);
errorNotFound.setText(R.string.onduleur_404_search);
}
else{
pvListC.addAll(pvList);
pvList.removeAll(pvList);
pvList.addAll(filtredList);
backSearch.setVisibility(View.VISIBLE);
inverterAdapter.notifyDataSetChanged();
recyclerView.setAdapter(inverterAdapter);
layInver.setVisibility(View.GONE);
slideDown= AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide_up);
layInver.startAnimation(slideDown);
layInver.setVisibility(View.VISIBLE);}
filtredList=new ArrayList<Onduleur>();
return true;
}
@Override
public boolean onQueryTextChange(String query) {
query.toLowerCase();
filtredList.clear();
for (Onduleur al:pvList){
if(al.getReference().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
if(filtredList.isEmpty()) {
layInver.setVisibility(View.GONE);
notfound.setVisibility(View.VISIBLE);
backSearch.setVisibility(View.VISIBLE);
errorNotFound.setText(R.string.onduleur_404_search);
}
else{
pvListC.addAll(pvList);
pvList.removeAll(pvList);
pvList.addAll(filtredList);
backSearch.setVisibility(View.VISIBLE);
inverterAdapter.notifyDataSetChanged();
recyclerView.setAdapter(inverterAdapter);
layInver.setVisibility(View.GONE);
slideDown= AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide_up);
layInver.startAnimation(slideDown);
layInver.setVisibility(View.VISIBLE);}
filtredList=new ArrayList<Onduleur>();
return true;
}
});
searchOnd.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
notfound.setVisibility(View.GONE);
pvList.clear();
preparePVData();
inverterAdapter.notifyDataSetChanged();
recyclerView.setAdapter(inverterAdapter);
layInver.setVisibility(View.GONE);
slideDown= AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide_up);
layInver.startAnimation(slideDown);
layInver.setVisibility(View.VISIBLE);
return false;
}
});
searchOnd.setOnQueryTextListener(新的SearchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
query.toLowerCase();
filterlist.clear();
用于(Onduleur al:pvList){
如果(al.getReference()匹配((“(.*)(“+query+”).*)){
过滤列表。添加(al);
}
}
if(filterlist.isEmpty()){
layInver.setVisibility(View.GONE);
设置可见性(View.VISIBLE);
backSearch.setVisibility(View.VISIBLE);
errorNotFound.setText(R.string.onduleur_404_搜索);
}
否则{
pvListC.addAll(pvList);
pvList.removeAll(pvList);
pvList.addAll(filterlist);
backSearch.setVisibility(View.VISIBLE);
invertradapter.notifyDataSetChanged();
recyclerView.setAdapter(Invertradapter);
layInver.setVisibility(View.GONE);
slideDown=AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide\u up);
layInver.startAnimation(向下滑动);
layInver.setVisibility(View.VISIBLE);}
FilterdList=新的ArrayList();
返回true;
}
@凌驾
公共布尔onQueryTextChange(字符串查询){
query.toLowerCase();
filterlist.clear();
用于(Onduleur al:pvList){
如果(al.getReference()匹配((“(.*)(“+query+”).*)){
过滤列表。添加(al);
}
}
if(filterlist.isEmpty()){
layInver.setVisibility(View.GONE);
设置可见性(View.VISIBLE);
backSearch.setVisibility(View.VISIBLE);
errorNotFound.setText(R.string.onduleur_404_搜索);
}
否则{
pvListC.addAll(pvList);
pvList.removeAll(pvList);
pvList.addAll(filterlist);
backSearch.setVisibility(View.VISIBLE);
invertradapter.notifyDataSetChanged();
recyclerView.setAdapter(Invertradapter);
layInver.setVisibility(View.GONE);
slideDown=AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide\u up);
layInver.startAnimation(向下滑动);
layInver.setVisibility(View.VISIBLE);}
FilterdList=新的ArrayList();
返回true;
}
});
searchOnd.setOnCloseListener(新的SearchView.OnCloseListener(){
@凌驾
公共布尔onClose(){
notfound.setVisibility(View.GONE);
pvList.clear();
preparePVData();
invertradapter.notifyDataSetChanged();
recyclerView.setAdapter(Invertradapter);
layInver.setVisibility(View.GONE);
slideDown=AnimationUtils.loadAnimation(getActivity().getApplicationContext(),R.anim.slide\u up);
layInver.startAnimation(向下滑动);
layInver.setVisibility(视图可见);
返回false;
}
});
而不是这个
for (Onduleur al:pvList) {
if(al.getReference().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
for (Onduleur al:pvList) {
if(al.getNomOnduleur().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
这样做:
for (Onduleur al:pvList) {
if(al.getReference().matches(("(.*)("+query+").*")) || al.getNomOnduleur().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
此外:
而不是pvList.removeAll(pvList)代码>请执行pvList.clear()代码>而不是此
for (Onduleur al:pvList) {
if(al.getReference().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
for (Onduleur al:pvList) {
if(al.getNomOnduleur().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
这样做:
for (Onduleur al:pvList) {
if(al.getReference().matches(("(.*)("+query+").*")) || al.getNomOnduleur().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
此外:
而不是pvList.removeAll(pvList)代码>请执行pvList.clear()代码>解决方案1:
在向列表中添加新项目之前,您必须清除列表,以防止创建重复项,然后只向列表中添加项目
**flitredList.clear();**
for (Onduleur al:pvList){
if(al.getReference().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
for (Onduleur al:pvList){
if(al.getNomOnduleur().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
解决方案2:
您在onquerytexsubmit()
和onQueryTextChange
中编写了相同的逻辑。尝试从onQueryTextChange()
中删除代码,因为每次文本更改时都会执行此方法。因此,项目将被添加到您的列表中。这可能是重复的原因
希望这有帮助。解决方案1:
在向列表中添加新项目之前,您必须清除列表,以防止创建重复项,然后只向列表中添加项目
**flitredList.clear();**
for (Onduleur al:pvList){
if(al.getReference().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
for (Onduleur al:pvList){
if(al.getNomOnduleur().matches(("(.*)("+query+").*"))){
filtredList.add(al);
}
}
解决方案2:
您在onquerytexsubmit()
和onQueryTextChange
中编写了相同的逻辑。尝试从onQueryTextChange()
中删除代码,因为每次文本更改时都会执行此方法。因此,项目将被添加到您的列表中。这可能是重复的原因
希望这有帮助。他已经做到了。->filterlist=newarraylist()
是一个默认为em空的新列表。我选择了如下答案,但现在arrayList中的搜索本身不起作用(尽管没有重复)@Meknesshamida检查解决方案2。他已经这样做了。->FilterdList=new arrayList()
是一个默认为em空的新列表。我选择了如下答案中的clear,但现在arrayList中的搜索本身不起作用(尽管没有重复)@Meknesshamida检查解决方案2。实际上我删除了第二个for循环,但现在搜索不起作用,即使存在匹配项,我也会显示“未找到”消息扫描您更新您的问题,以便我可以查看当前代码?因此,现在您只有一个if语句if(al.getReference().matches((“(.*)(“+query+”).*))
是否要尝试像我上面提到的那样