【问题标题】:how do I correctly implement Filterable to search in a BaseAdapter?如何正确实现 Filterable 以在 BaseAdapter 中进行搜索?
【发布时间】:2014-09-02 16:44:25
【问题描述】:

我在ListView 中显示朋友列表,并在EditText 上设置TextWatcher 以允许搜索。这适用于 1 个限制(我没有得到):输入一个字符正确过滤列表,删除一个字符但没有做任何事情。当输入为空时,原始列表正确显示,但是Filter 也应该在删除字符时起作用,因为onTextChanged() 被调用。我哪里错了?

类 (BaseAdapter) 字段:

private ArrayList<User> friends;
private ArrayList<User> originalFriendList;
//to keep track of the original list
this.originalFriendList = friends;

过滤器类:

      private class FriendSearchFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();
        if (constraint != null && constraint.length() > 0) {

            ArrayList<User> filterList = new ArrayList<User>();

            for (User friend : friends) {
                if (StringUtils.containsIgnoreCase(friend.getLast_name(), constraint)
                        || StringUtils.containsIgnoreCase(friend.getFirst_name(), constraint)) {
                    filterList.add(friend);
                }
            }
            results.count = filterList.size();
            results.values = filterList;
        } else {
             // the input is empty
            results.count = originalFriendList.size();
            results.values = originalFriendList;
        }
        return results;
    }

    @Override
    @SuppressWarnings("unchecked")
    protected void publishResults(CharSequence constraint, FilterResults results) {
        friends = (ArrayList<User>) results.values;
        notifyDataSetChanged();
    }
}

TextWatcher:

                 etSearch.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int start,
                                      int before, int count) {
            /* no action required */
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int start, int count, int after) {
            if(mFriendListFrag == null || !mFriendListFrag.equals(mFragAdapter.getItem(mViewPager.getCurrentItem())));
                mFriendListFrag = (FriendListFragment) mFragAdapter.getItem(mViewPager.getCurrentItem());
                mFLAdapter = (FriendListAdapter) mFriendListFrag.getListAdapter();
            mFLAdapter.getFilter().filter(charSequence.toString());
            Log.e("ON", "TEXT CHANGED");
        }

        @Override
        public void afterTextChanged(Editable editable) {
             /* no action required */
        }
    });

【问题讨论】:

    标签: android android-filter android-filterable


    【解决方案1】:

    以防万一有人遇到类似问题:我必须将约束与原始列表进行比较,而不是在我尝试向后过滤时被覆盖的“工作列表”:

            for (User friend : originalFriendList)
    

    而不是

            for (User friend : friends)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多