[英]Filtering causes both lists to delete their Items - Android RecyclerView Filtering Java
所以我想做的只是根据 searchString 过滤我的所有条目。 这工作正常但出于某种原因每次我过滤两个列表都会删除项目。 我只会在这里包括(我认为)重要的代码部分。
适配器.java:
@Override
public Filter getFilter() {
return myFilter;
}
private Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<Stellplatz> filteredList = new ArrayList<>();
Log.d("TEst","Size stellplaetzeall:"+ stellplaetzeall.size());
Log.d("TEst","Size Stellplaeztze:"+ stellplaetze.size());
if (constraint == null || constraint.length() == 0) {
filteredList.addAll(stellplaetzeall);
} else {
String filterPattern = constraint.toString().toLowerCase().trim();
for (Stellplatz item : stellplaetzeall) {
if (item.getAnbieter().toLowerCase().contains(filterPattern)) {
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
stellplaetze.clear();
stellplaetze.addAll((ArrayList) results.values);
notifyDataSetChanged();
}
};
片段.java
@Override
public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater){
inflater.inflate(R.menu.menu_itemlist, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
}
我不明白为什么会这样。 我发现的每个示例都与我的代码基本相同,但由于某种原因它发生了。 我真的很感激任何能帮助我理解这一点的答案。 我也不太擅长 android 编程,第一次这样做所以解释为什么会很有帮助!
在发布结果时,您正在清除列表,我认为这是错误的:
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
//stellplaetze.clear();
stellplaetze.addAll((ArrayList) results.values);
notifyDataSetChanged();
}
我有一个代码示例,我认为这会有所帮助:
首先我创建 2 个列表:
private ArrayList<CountryPhone> objects;
private ArrayList<CountryPhone> filteredData;
@Override
public int getCount() {
return filteredData.size();
}
@Nullable
@Override
public CountryPhone getItem(int position) {
return filteredData.get(position);
}
关于过滤结果:
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults filterResults = new FilterResults();
ArrayList<CountryPhone> filterlist = new ArrayList<>();
String name, code;
for (int i = 0; i < objects.size(); i++) {
CountryPhone item = objects.get(i);
name = item.getName().toLowerCase();
code = item.getCode();
if (name.contains(filterString) || code.contains(filterString)){
filterlist.add(item);
}
}
filterResults.values = filterlist;
filterResults.count = filterlist.size();
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData = (ArrayList<CountryPhone>) results.values;
notifyDataSetChanged();
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.