【问题标题】:Search inside Android RecyclerView ArrayList在 Android RecyclerView ArrayList 中搜索
【发布时间】:2017-07-10 09:52:26
【问题描述】:

我正在尝试为我的 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;
        }
    });

【问题讨论】:

    标签: android search android-recyclerview


    【解决方案1】:

    不是这个

     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 循环,但现在搜索不起作用,即使有匹配项,我也会显示未找到消息
    • 能否更新您的问题,以便我查看当前代码?
    • 那么现在你只有一个 if statment if(al.getReference().matches(("(.*)("+query+").*"))) 你想尝试像我上面提到的那样吗? -if(al.getReference().matches(("(.*)("+query+").*")) || al.getNomOnduleur().matches(("(.*)("+query+").*")))
    【解决方案2】:

    解决方案 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:

    您在onQueryTextSubmit()onQueryTextChange 中编写了相同的逻辑。尝试从onQueryTextChange()删除代码,因为每次文本更改时都会执行此方法。因此,项目将被添加到您的列表中。这可能是重复的原因。

    希望这会有所帮助。

    【讨论】:

    • 他已经这样做了。-> filtredList=new ArrayList&lt;Onduleur&gt;(); 是一个默认为空的新列表。
    • 我选择了明确的答案,但现在 arrayList 中的搜索本身不起作用(虽然没有重复)
    • @MeknessiHamida 检查解决方案 2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多