Android GridView不在空搜索框中显示记录

时间:2015-10-06 11:00:13

标签: android gridview

这是我的应用程序所做的,用户可以通过搜索框进行搜索。当他输入内容和匹配时,它会过滤gridview。但是当他试图删除时,没有记录显示。 在清空搜索框时,我一直在显示整个记录。

这是我尝试过的:

MainActivity.class:

  etSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                adapter.getFilter().filter(cs.toString());


        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

        }

        @Override
        public void afterTextChanged(Editable cs) {

        }
    });

CustomAdapter.class:

  @Override
public Filter getFilter() {
    if (starsFilter == null)
        starsFilter = new StarsFilter();
    return starsFilter;
}

private class StarsFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        // Create a FilterResults object
        FilterResults results = new FilterResults();

        constraint = constraint.toString().toLowerCase();

        if (constraint != null && constraint.toString().length() > 0) {
            ArrayList<HashMap<String, String>> filteredStars = new ArrayList<>();
            for(HashMap<String, String> item : data){
                if(item.toString().toLowerCase().contains(constraint)){
                    filteredStars.add(item);
                }
            }
            results.values = filteredStars;
            results.count = filteredStars.size();
        } else {
            synchronized(this) {
                results.values = data;
                results.count = data.size();
            }
        }

        // Return our FilterResults object
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        data.clear();

        if (constraint.length() == 0) {
            notifyDataSetInvalidated();
        } else {
            for (HashMap<String, String> result : (ArrayList<HashMap<String, String>>) results.values) {
                data.add(result);
            }
            notifyDataSetChanged();
        }

    }


}

有什么想法吗?我很感激你的帮助。提前谢谢!

1 个答案:

答案 0 :(得分:0)

首先,不要使用名为ArrayList的单data来存储初始结果和过滤结果。请注意,在发布结果中,您首先清除了data,因此一旦用户使用搜索 - 原始数据会部分/完全丢失。

例如,您的适配器中有2 ArrayList个名为originalDatafilteredData。过滤期间originalData不得更改。最初filteredData必须是originalData的副本,并且您的适配器必须始终使用filteredData作为源数据集。

在执行过滤时,您必须修改/清除/填充filteredData。如果constraint为空字符串,则必须将所有originalData内容复制到filteredData

然后在publishResults中将支票从constraint.length() == 0更改为results.count == 0