ListView中的Android搜索无法正常工作

时间:2013-08-07 17:20:19

标签: android listview search adapter

我正在尝试将搜索功能添加到具有自定义适配器的ListView。当我在EditText中键入内容时,它会搜索并显示结果,但是如果我尝试删除我刚才写的内容,它将不会出现初始列表,它将保留已经过滤的列表。 这是代码:

在MainActivity中:

private TextWatcher searchTextWatcher = new TextWatcher() {
    @Override
        public void onTextChanged(CharSequence s, int start, int before, int count)     {
              adapter.getFilter().filter(s.toString());
              adapter.notifyDataSetChanged();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int     after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    };

在LazyAdapter中:

public Filter getFilter() {
    return new Filter() {
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            data = (ArrayList<HashMap<String, String>>) results.values;
            LazyAdapter.this.notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            ArrayList<HashMap<String, String>> filteredResults = getFilteredResults(constraint);

            FilterResults results = new FilterResults();
            results.values = filteredResults;

            return results;
        }
    };
}

protected ArrayList<HashMap<String, String>> getFilteredResults(
        CharSequence constraint) {
    ArrayList<HashMap<String, String>> filteredTeams = new ArrayList<HashMap<String, String>>();
    for(int i=0;i< data.size();i++){
        if(data.get(i).get(MainActivity.KEY_TITLE).toLowerCase().startsWith(constraint.toString().toLowerCase())){
            filteredTeams.add(data.get(i));
        }
    }

    return filteredTeams;
}

我的代码出了什么问题? 谢谢!

1 个答案:

答案 0 :(得分:4)

意识到当您过滤时,您正在使用过滤结果替换ArrayList中的未过滤结果。当您按退格键删除字符时,您现在尝试根据已经过滤的列表进行过滤,这就是您的结果不会更改的原因。您需要保留对未应用任何过滤器的原始数据集的引用,并始终使用该数据集进行过滤,但永远不要更改/替换它。