如何使用 Filter 将 originalList 与 recyclerview 中的 filterList 进行比较?
How to compare originalList to filterList in recyclerview using Filter?
在这段代码中,我搜索了多个文本。我有搜索sachin。
sachin 正在显示列表,但单击以将 sachin 返回到 sac 不显示到适配器上的 sa 列表。没有库怎么解决?
当我按回space并删除一个字符时,这次不列出不显示。
例子
假设我有搜索 sachin 到文本更改 sachin 到 sac。在这种情况下不显示 sa 列表。我已经清除所有列表,案例显示所有列表。
搜索并显示列表
萨钦和萨达
现在搜索sac
现在显示 sachin
只搜索 sac 到 sc
那是只显示时间的sachin
不显示列表中的 sardar
我的适配器
private class ItemFilter extends Filter {
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
ArrayList<Build> buildlist = new ArrayList<Build>();
for (int i = 0; i < buildList.size(); i++) {
if ((buildList.get(i).getName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Build babydata = new Build(buildList.get(i).getImages(), buildList.get(i).getName());
buildlist.add(babydata);
}
}
results.count = buildlist.size();
results.values = buildlist;
} else {
results.count = buildList.size();
results.values = buildList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
buildList = (ArrayList<Build>) results.values;
notifyDataSetChanged();
}
}
Activity class
EditText editTxt = (EditText) findViewById(R.id.search);
editTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() <= 0) {
Log.d("jay", "s.length() <= 0" + s.toString());
buildList.clear();
buildList.addAll(buildListCopy);
recyclerView.setAdapter(null);
buildCustomAdapter = new BuildCustomAdapter(buildList);
recyclerView.setAdapter(buildCustomAdapter);
} else {
buildCustomAdapter.getFilter().filter(s.toString());
}
Log.d("jay", "mobisharnam" + s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
我更喜欢谓词作为搜索过滤器
我已经更改了您的代码以使用谓词,为此您必须使用 google 番石榴库
在您的 gradle
中包含以下依赖项
compile 'com.google.guava:guava:19.0'
现在,检查以下代码
EditText editTxt = (EditText) findViewById(R.id.search);
editTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String searchQuery = s.toString();
if (buildListCopy != null && buildListCopy.size() > 0) {
buildList = Lists.newArrayList(Collections2.filter(buildListCopy, new SearchFilter(searchQuery)));
recyclerView.setAdapter(null);
if (buildList != null && buildList.size() > 0) {);
buildCustomAdapter = new BuildCustomAdapter(buildList);
recyclerView.setAdapter(buildCustomAdapter);
recyclerView.getAdapter().notifyDataSetChanged();
}
}
return false;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
这是我们在上面使用的搜索过滤器谓词
/**
* Custom Predicate class to filter list as per search query
*/
public final class SearchFilter implements Predicate<Build> {
private final Pattern pattern;
public SearchFilter(final String regex) {
pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.LITERAL);
}
@Override
public boolean apply(final Build input) {
return pattern.matcher(input.getName().toLowerCase()).find();
}
}
没有任何库简单逻辑
这个问题终于有了答案
在您的 Adapter Constructor 中添加新的副本列表
复制列表添加到过滤器后
private List<YourModel> modelList;
private List<YourModel> modelListCopy;
private ItemFilter mFilter = new ItemFilter();
public YourAdapter(List<YourModel> modelList) {
this.modelList= modelList;
this.modelListCopy= new ArrayList<>();
modelListCopy.addAll(modelList);
}
private class ItemFilter extends Filter {
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
List<YourModel> filterList = new ArrayList<YourModel>();
for (int i = 0; i < modelListCopy.size(); i++) {
if ((modelListCopy.get(i).getName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
YourModel builddata = new YourModel(modelListCopy.get(i).getImages(), modelListCopy.get(i).getName());
filterList.add(builddata);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = modelListCopy.size();
results.values = modelListCopy;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
modelList= (ArrayList<YourModel>) results.values;
notifyDataSetChanged();
}
Activity Class
像这样
CustomAdapter youradapter= new CustomAdapter(modelList);
在这段代码中,我搜索了多个文本。我有搜索sachin。
sachin 正在显示列表,但单击以将 sachin 返回到 sac 不显示到适配器上的 sa 列表。没有库怎么解决?
当我按回space并删除一个字符时,这次不列出不显示。
例子
假设我有搜索 sachin 到文本更改 sachin 到 sac。在这种情况下不显示 sa 列表。我已经清除所有列表,案例显示所有列表。
搜索并显示列表
萨钦和萨达
现在搜索sac
现在显示 sachin
只搜索 sac 到 sc
那是只显示时间的sachin
不显示列表中的 sardar
我的适配器
private class ItemFilter extends Filter {
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
ArrayList<Build> buildlist = new ArrayList<Build>();
for (int i = 0; i < buildList.size(); i++) {
if ((buildList.get(i).getName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
Build babydata = new Build(buildList.get(i).getImages(), buildList.get(i).getName());
buildlist.add(babydata);
}
}
results.count = buildlist.size();
results.values = buildlist;
} else {
results.count = buildList.size();
results.values = buildList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
buildList = (ArrayList<Build>) results.values;
notifyDataSetChanged();
}
}
Activity class
EditText editTxt = (EditText) findViewById(R.id.search);
editTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() <= 0) {
Log.d("jay", "s.length() <= 0" + s.toString());
buildList.clear();
buildList.addAll(buildListCopy);
recyclerView.setAdapter(null);
buildCustomAdapter = new BuildCustomAdapter(buildList);
recyclerView.setAdapter(buildCustomAdapter);
} else {
buildCustomAdapter.getFilter().filter(s.toString());
}
Log.d("jay", "mobisharnam" + s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
我更喜欢谓词作为搜索过滤器 我已经更改了您的代码以使用谓词,为此您必须使用 google 番石榴库 在您的 gradle
中包含以下依赖项compile 'com.google.guava:guava:19.0'
现在,检查以下代码
EditText editTxt = (EditText) findViewById(R.id.search);
editTxt.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String searchQuery = s.toString();
if (buildListCopy != null && buildListCopy.size() > 0) {
buildList = Lists.newArrayList(Collections2.filter(buildListCopy, new SearchFilter(searchQuery)));
recyclerView.setAdapter(null);
if (buildList != null && buildList.size() > 0) {);
buildCustomAdapter = new BuildCustomAdapter(buildList);
recyclerView.setAdapter(buildCustomAdapter);
recyclerView.getAdapter().notifyDataSetChanged();
}
}
return false;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
这是我们在上面使用的搜索过滤器谓词
/**
* Custom Predicate class to filter list as per search query
*/
public final class SearchFilter implements Predicate<Build> {
private final Pattern pattern;
public SearchFilter(final String regex) {
pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.LITERAL);
}
@Override
public boolean apply(final Build input) {
return pattern.matcher(input.getName().toLowerCase()).find();
}
}
没有任何库简单逻辑
这个问题终于有了答案
在您的 Adapter Constructor 中添加新的副本列表
复制列表添加到过滤器后
private List<YourModel> modelList;
private List<YourModel> modelListCopy;
private ItemFilter mFilter = new ItemFilter();
public YourAdapter(List<YourModel> modelList) {
this.modelList= modelList;
this.modelListCopy= new ArrayList<>();
modelListCopy.addAll(modelList);
}
private class ItemFilter extends Filter {
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
List<YourModel> filterList = new ArrayList<YourModel>();
for (int i = 0; i < modelListCopy.size(); i++) {
if ((modelListCopy.get(i).getName().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
YourModel builddata = new YourModel(modelListCopy.get(i).getImages(), modelListCopy.get(i).getName());
filterList.add(builddata);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = modelListCopy.size();
results.values = modelListCopy;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
modelList= (ArrayList<YourModel>) results.values;
notifyDataSetChanged();
}
Activity Class
像这样
CustomAdapter youradapter= new CustomAdapter(modelList);