我有一个ListView,它包含一个EditText来过滤列表结果。在这个阶段,一切都运作良好。
我的问题是在单击列表中的项目然后返回ListView后,列表中的项目消失了,很可能因为EditText在按下后退按钮后包含空格 。为什么会这样?
我在Log
内放了一个onTextChanged
来查看按下后退按钮时放置的字符。它只是空白。我不确定为什么这个监听器会添加一个空格并在按下后退按钮后过滤结果。
以下是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) {
}
});
}
}
实现可过滤的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中添加一个空格并将其删除。这将显示上一个列表。我错过了什么?
答案 0 :(得分:1)
您可能正在重新创建listAdapter对象,这将使先前创建的listAdapter无效。
您对textwatcher的调用指向较旧的listadapter,其中在onResume / OnCreateView事件中生成了listadapter的新实例。
我通过在我的片段中声明listadapter对象作为成员并在onResume方法中检查它来解决我的问题,如下所示
@Override
public void onResume() {
super.onResume();
if (news == null) {
if(CommonFun.isInternetOn(activity))
new NewsRetrivalTask().execute();
else
ToastMsg.showToast(activity, Msg.alertInternetMsg);
} else {
newsListAdapter = new NewsListAdapter(getActivity(), news);
lv.setAdapter(newsListAdapter);
lv.setOnItemClickListener(MAP_FragmentChatRoom.this);
lv.setVisibility(View.VISIBLE);
tvNoRecord.setVisibility(View.GONE);
}
}
和onCreateView方法中的textwatcher
etSearch.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) { }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
public void onTextChanged(CharSequence s, int start, int before, int count) {
newsListAdapter.getFilter().filter(s);
}
});