popBackStack后,TextWatcher过滤器无法正常工作

时间:2014-04-15 09:49:41

标签: android listview

我有一个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中添加一个空格并将其删除。这将显示上一个列表。我错过了什么?

1 个答案:

答案 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);
        }
    });