【问题标题】:Android Search in ListView not working properlyListView 中的 Android 搜索无法正常工作
【发布时间】:2013-08-07 17:20:18
【问题描述】:

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

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

【问题讨论】:

标签: android listview search adapter


【解决方案1】:

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

【讨论】:

  • 谢谢!我终于设法让它工作(通过制作该 ArrayList 的副本并始终使用它进行过滤)。
猜你喜欢
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多