1

我正在尝试将搜索功能添加到具有自定义适配器的 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;
}

我的代码有什么问题?谢谢!

4

1 回答 1

4

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

于 2013-08-07T18:04:47.293 回答