【发布时间】:2014-05-29 14:21:56
【问题描述】:
我有一个 ListView,其中包含一个 EditText 来过滤列表结果。在这个阶段一切都运行良好。
我的问题是单击列表中的项目然后返回 ListView 后,列表中的项目消失了,很可能是因为 EditText 在按下后退按钮后包含一个 空白空间 .为什么会这样?
我在onTextChanged 中添加了Log,以查看按下后退按钮时输入的字符。它只是空白。我不确定为什么这个监听器会添加一个空格并在按下后退按钮后过滤结果。
这是ListFragment中的代码:
public class CategoryFragment extends ListFragment {
...
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// filter result
etFilterCategory.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
// Log.d(TAG, "ontextchanged= " + charSequence);
va.getFilter().filter(charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
实现 Filterable 的 BaseAdapter:
public class CategoryAdapter extends ArrayAdapter<CategoryModel> implements
Filterable {
...
@Override
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final ArrayList<CategoryModel> list = originalData;
int count = list.size();
final ArrayList<CategoryModel> nlist = new ArrayList<CategoryModel>(count);
String filterableString;
for (int i = 0; i < count; i++) {
filterableString = list.get(i).getName();
if(filterableString.toLowerCase().contains(filterString)) {
// add the whole custom row
nlist.add(list.get(i));
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
arrCategory = (ArrayList<CategoryModel>) results.values;
notifyDataSetChanged();
}
}
}
我如何不在每次按下后退按钮后过滤 ListView 项?
编辑:
按下后退按钮后,使 ListView 可见的唯一方法是在 EditText 中添加一个空格并将其删除。这将显示上一个列表。我错过了什么?
【问题讨论】: