【问题标题】:TextWatcher filter isn't working correctly after popBackStack在 popBackStack 后 TextWatcher 过滤器无法正常工作
【发布时间】: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 中添加一个空格并将其删除。这将显示上一个列表。我错过了什么?

【问题讨论】:

    标签: android listview


    【解决方案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);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 2015-02-14
      • 2013-08-16
      • 2012-11-16
      • 2011-04-06
      相关资源
      最近更新 更多