Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java recyclerview中的Searchview复制数据_Java_Android_Android Recyclerview_Searchview - Fatal编程技术网

Java recyclerview中的Searchview复制数据

Java recyclerview中的Searchview复制数据,java,android,android-recyclerview,searchview,Java,Android,Android Recyclerview,Searchview,搜索视图在操作栏中实现,搜索工作正常,但例如, 如果用户搜索两个字符pa,则我的列表包含与pa相关的两个数据,即pack1、pack2,然后在回收器视图中加载数据。现在,如果用户输入另一个字符l,到前面的字符pa,现在我的搜索视图有pal,但是数组列表与搜索不匹配,列表不包含任何pal项目。即,现在回收器视图为空。现在,如果我清除字符l,列表将重新加载数据pack1、pack2,但结果将加载2次,即在recyclerview中不显示2项,而是总共显示4项。 当搜索被清除时,它将复制项目 搜索视图

搜索视图在操作栏中实现,搜索工作正常,但例如, 如果用户搜索两个字符pa,则我的列表包含与pa相关的两个数据,即pack1、pack2,然后在回收器视图中加载数据。现在,如果用户输入另一个字符l,到前面的字符pa,现在我的搜索视图有pal,但是数组列表与搜索不匹配,列表不包含任何pal项目。即,现在回收器视图为空。现在,如果我清除字符l,列表将重新加载数据pack1、pack2,但结果将加载2次,即在recyclerview中不显示2项,而是总共显示4项。 当搜索被清除时,它将复制项目

搜索视图

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_order, menu);
        searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                mOrderAdapter.getFilter().filter(query);
                searchView.clearFocus();
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if(newText.length()==0){
                    getData();
                    searchView.clearFocus();
                }
                mOrderAdapter.getFilter().filter(newText);
                return true ;
            }
        });
        return true;
    }
过滤代码

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                String charString = constraint.toString();
                if (charString.isEmpty()||charString.length()==0) {
                    mListFilter = mOrderArrayList;
                } else {
                    List<Order> filteredList = new ArrayList<>();
                    ArrayList<Order> templist=new ArrayList<Order>();
                    for (Order ord : mOrderArrayList) {
                        if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
                                || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(ord);
                            templist.addAll(mListFilter);
                        }
                    }
                    mOrderArrayList.removeAll(templist);
                    mOrderArrayList.addAll(filteredList);
                    mListFilter = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = mListFilter;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                mListFilter = (ArrayList<Order>) results.values;
                notifyDataSetChanged();
            }
        };
    }

这是因为您在
#performFiltering
的循环中使用了
addAll
。还有,为什么您有两个本地列表用于筛选?检查下面的方法,它应该可以工作。我已经删除了额外的代码和导致问题的代码

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String charString = constraint.toString();
            List<Order> filteredList = new ArrayList<>();
            if (charString.isEmpty()||charString.length()==0) {
                filteredList.addAll(mOrderArrayList);
            } else {
                for (Order ord : mOrderArrayList) {
                    if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
                            || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
                        filteredList.add(ord);
                    }
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;
            return filterResults;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mListFilter = (ArrayList<Order>) results.values;
            notifyDataSetChanged();
        }
    };
}
@覆盖
公共过滤器getFilter(){
返回新筛选器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
String charString=constraint.toString();
List filteredList=新建ArrayList();
if(charString.isEmpty()| | charString.length()==0){
filteredList.addAll(mOrderArrayList);
}否则{
for(订单ord:mOrderArrayList){
if(ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
||ord.getItemName().toLowerCase().contains(charString.toLowerCase()){
过滤器列表添加(ord);
}
}
}
FilterResults FilterResults=新的FilterResults();
filterResults.values=filteredList;
返回过滤器结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
mListFilter=(ArrayList)results.values;
notifyDataSetChanged();
}
};
}

谢谢您的帮助。解决方案是有效的。但还有一个问题。现在,如果我输入另一个字符,比如pac,在清除这个重复之后,会再次发生。当我遇到一个类似的重复问题时,创建了两个locallist。adapter的代码有问题。我添加了sirCode对我来说很好。试试调试好的,谢谢。在代码中添加临时列表是因为在过滤后,当单击过滤项目时,会打开其他项目,即打开主列表中的项目而非过滤列表。简而言之,在过滤后,它将占据主列表而不是过滤列表的位置。我现在如何通过代码解决这个问题
  brandView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), brandView,
                new RecyclerTouchListener.ClickListener() {
                    @Override
                    public void onClick(View view, int position) {
                        isRefreshData = true;
                        startActivity(new Intent(mContext, ViewOrderDetails.class).putExtra("Key-Intent-OrderNo",mOrderArrayList.get(position).getOs_OrderNo()).putExtra("Key-Intent-BrandName",mOrderArrayList.get(position).getos_BrandName()));
                    }
                    @Override
                    public void onLongClick(View view, int position) {
                    }
                }));
@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String charString = constraint.toString();
            List<Order> filteredList = new ArrayList<>();
            if (charString.isEmpty()||charString.length()==0) {
                filteredList.addAll(mOrderArrayList);
            } else {
                for (Order ord : mOrderArrayList) {
                    if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
                            || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
                        filteredList.add(ord);
                    }
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;
            return filterResults;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mListFilter = (ArrayList<Order>) results.values;
            notifyDataSetChanged();
        }
    };
}