过滤后重置listview

时间:2014-11-10 18:09:24

标签: android listview textwatcher

我正在使用AutoCompleteTextView(稍后将其更改为editText,但一次只有一个问题)来过滤我实现textWatcher的listView的结果:

fqp = new FilterQueryProvider() {
            @Override
            public Cursor runQuery(CharSequence constraint) {
                String itemName = constraint.toString();
                return getSearch(itemName);
            }
        };

Cursor getSearch(String itemName) {
        String searchSelect = "(" + MediaStore.Audio.Media.TITLE + " LIKE ? )";
        String[]  selectArgs = { "%" + itemName + "%"};
        Cursor searchCursor = getContentResolver().query(
                queryUri,
                projection,
                searchSelect,
                selectArgs,
                MediaStore.Audio.Media.TITLE + " ASC"
        );
        return searchCursor;
    }

public void onTextChanged(CharSequence s, int start, int before,
                              int count) {
        String empty = "";
        if(s.toString() == empty){
            adapter.changeCursor(getAll());
            adapter.notifyDataSetChanged();
        }else{
            adapter.getFilter().filter(s.toString());
            adapter.notifyDataSetChanged();
        }
    }

这个过滤器工作得很好,但是当我的autoCompleteTextView为空时,我需要想办法重置我的列表。当然有一种正确的方法可以做到这一点,除了测试它是否为空,但这是我试图无济于事的。我还应该创建两个游标:一个包含我的完整列表,另一个包含我的过滤列表,所以我不必重新查询内容提供商?

1 个答案:

答案 0 :(得分:1)

问题似乎在于这一行

if(s.toString() == empty)

在Java中,您无法比较这样的字符串,您需要使用

if(s.toString().equals(empty))

还没有调用TextWatcher,因为侦听器未链接到您的AutoCompleteTextView。


我也应该创建两个游标:一个包含我的完整列表,另一个包含我的过滤列表,所以我不必重新查询内容提供者?

如果过滤后的列表每次都有相同的数据,那么最好保留对它的引用,而不是进行新的查询。

使用EditText的示例:

adapter.setFilterQueryProvider(fqp);
search.addTextChangedListener(watch);

fqp = new FilterQueryProvider() {
    @Override
    public Cursor runQuery(CharSequence constraint) {
        String itemName = constraint.toString();
        return getSearch(itemName);
    }
};

Cursor cursor = getContentResolver().query(
    queryUri,
    projection,
    null,
    null,
    MediaStore.Audio.Media.TITLE+" ASC"
);

Cursor getSearch(String itemName) {
    String searchSelect = "(" + MediaStore.Audio.Media.TITLE + " LIKE ? )";
    String[]  selectArgs = { "%" + itemName + "%"};
    Cursor searchCursor = getContentResolver().query(
        queryUri,
        projection,
        searchSelect,
        selectArgs,
        MediaStore.Audio.Media.TITLE + " ASC"
    );
    return searchCursor;
}

TextWatcher watch = new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before,
                              int count) {
        String empty = "";
        if (s.toString().equals(empty)) {
            adapter.changeCursor(cursor);
            adapter.notifyDataSetChanged();
        } else {
            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) {

    }
};