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