【发布时间】:2020-03-07 14:46:43
【问题描述】:
我有一个带有过滤器的列表视图。当我在用作过滤器的编辑文本中输入一些单词时,例如“david”,它运行良好,列表中的项目被过滤,它将显示所有包含“david”的项目。但是当我删除一些单词时,例如“dav”,列表仍然被过滤,但它是从最后一个被“david”过滤的。
假设我有 40 个项目,通过“david”过滤,变成 24 个项目。然后我用“dav”再次过滤它,它是从“24 项”一项中过滤出来的,而不是“40 项”一项。
这是我的自定义适配器:
public class WRegistrantListAdapter extends ArrayAdapter<Registrant> {
private Context mContext;
private int mResource;
private List<Registrant> mOriginalList;
private List<Registrant> mFilteredList;
public WRegistrantListAdapter(Context context, int resource, ArrayList<Registrant> oobjects, int workshopItemId) {
super(context, resource, oobjects);
mContext = context;
mResource = resource;
mFilteredList = oobjects;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//contains code for displaying item.
}
@NonNull
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults result = new FilterResults();
String constraint = charSequence.toString().toLowerCase();
if (mOriginalList == null) {
mOriginalList = mFilteredList;
Toast.makeText(mContext, String.valueOf(mOriginalList.size()), Toast.LENGTH_SHORT).show();
}
if (constraint == null || constraint.isEmpty() || constraint.equals("")) {
result.values = mOriginalList;
result.count = mOriginalList.size();
} else {
List<Registrant> list = new ArrayList<>();
int max = mOriginalList.size();
for (int cont = 0; cont < max; cont++) {
Registrant item = mOriginalList.get(cont);
boolean contains =
item.getRegistrantName().toLowerCase().contains(constraint) ||
item.getRegistrantNumber().toLowerCase().contains(constraint);
if (contains) {
list.add(mOriginalList.get(cont));
}
}
result.values = list;
result.count = list.size();
}
return result;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
clear();
addAll((ArrayList<Registrant>) results.values);
notifyDataSetChanged();
}
};
}
}
过滤中的哪一部分是错误的?任何帮助将非常感激。希望我的解释不会令人困惑,因为英语不是我的母语。
【问题讨论】:
-
尝试将
mOriginalList = mFilteredList;更改为mOriginalList = new ArrayList<>(mFilteredList);。希望有帮助! -
谢谢,它正在工作! mOriginalList = mFilteredList; 之间有何不同?和 mOriginalList = new ArrayList(mFilteredList);?你能把你的答案写出来让我接受吗?
标签: android android-listview android-filter