在Android RecyclerView ArrayList中搜索

在Android RecyclerView ArrayList中搜索,android,search,android-recyclerview,Android,Search,Android Recyclerview,我正在尝试为我的recyclerView实现一个搜索选项,用户可以在其中键入引用。但每次我在“搜索”视图中键入字符时,我的arrayList都会重复,即使我尝试清除它,它也不会起作用: 这是最初的看法: 这就是搜索错误 这是我的搜索代码 searchOnd.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQuery

我正在尝试为我的recyclerView实现一个搜索选项,用户可以在其中键入引用。但每次我在“搜索”视图中键入字符时,我的arrayList都会重复,即使我尝试清除它,它也不会起作用: 这是最初的看法:

这就是搜索错误

这是我的搜索代码

         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+”).*))
是否要尝试像我上面提到的那样