나는 RecyclerView.Adapter<RecyclerView.ViewHolder>
을 확장하고 Filterable
을 구현하는 adapter
을 가지고 있습니다.RecyclerView.Adapter를 사용하여 많은 항목 필터링하기
내 getFilter()
구현은 다음과 같습니다
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mPersonListFiltered = (List<Person>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List<Person> filtered = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
results.count = mPersonList.size();
results.values = mPersonList;
} else {
String name, email, constr = Utils.removeDiacriticalMarks(constraint.toString());
for (Person person : mPersonList) {
name = Utils.removeDiacriticalMarks(person.getName().toLowerCase());
email = person.getEmail().toLowerCase();
if (name.contains(constr) || email.contains(constr)) {
filtered.add(person);
}
}
results.count = filtered.size();
results.values = filtered;
}
return results;
}
};
}
내가 입력하는 동안 내 사람 목록을 필터링하고 싶습니다. 내 목록 크기가 1k보다 크지 않다면 잘 작동하지만 5k, 10k 등으로 확장하면 느려지기도합니다. 왜 나는 이름과 이메일에 제약이 있는지를 확인해야하는 모든 사람들에게 끔찍한 이유가 무엇인지 이해합니다. 그러나이 상황에서 많은 항목, 동일한 결과를 얻기위한 최상의 구현 또는 대안, 즉 로컬 거대한 목록에 대한 빠른 필터 방법과 "즉시"방법이 궁금합니다. 타자.
감사합니다.
버튼이 어댑터 를 정의 할 때 반환 하나 개의 모델이 메소드는 오버라이드 (override) 할 필요가이 메소드를 클릭하면 이것은 어댑터에서 필터링 할 수있는 최선의 대체 솔루션입니다. –