0

我断断续续地用头撞这个已经两天了。

我尝试使用 getfilter.filter() 但它没有用。所以我创建了这个代码来搜索一个列表。它可以工作,但是当我删除一些字母时,列表会卡在最后一个结果上并且永远不会更新。

例如列表:你好,嗨,汉,独奏

当我输入'h'然后你好,你好,汉出现。

当我添加一个“e”时,这就是它的“他”只有你好显示

当我删除 e 时,han 和 hi 不再出现。

private TextWatcher filterTextWatcher = new TextWatcher() {
     final ArrayList<String> finalItems = mItems;
    @Override
    public void afterTextChanged(Editable s) {
    }

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



    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        ArrayList<String> searchedItems = retainsSearched(mItems, s.toString());
        adapter.clear();
        for (int i = 0; i < searchedItems.size(); i++) {
            adapter.add(searchedItems.get(i));
        }
        adapter.notifyDataSetChanged();
    }

};

public  ArrayList<String> retainsSearched(ArrayList<String> mItems2, String term) {
    ArrayList<String> stations = new ArrayList<String>();
    for (int i = 0; i < mItems2.size(); i++) {
        if (mItems2.get(i).toLowerCase().startsWith(term.toLowerCase())) {
            stations.add(mItems2.get(i));
        }
    }
    return stations;
}
4

1 回答 1

1

当我输入'h'然后你好,你好,汉出现。当我添加一个“e”时,它的“he”只有当我删除 e 时才会显示 hello,han 和 hi 不会再次出现。

这很可能会发生,因为mItems您在 中使用TextWatcher的列表是支持您的适配器的列表,因此通过修改它(在过滤和清除/重新添加适配器中的项目时),您总是会减少适配器中可用的项目数量,每次过滤列表时“看到”的项目。

而是尝试mItems在适配器中制作初始项目(列表)的副本,并始终通过测试该副本中的项目来进行过滤(但不要修改它,只需将匹配的项目添加到适配器)。

同样,您应该使用该getFilter()方法。

编辑:

ArrayList<String> searchedItems = retainsSearched(s.toString()); 
// ...

public  ArrayList<String> retainsSearched(ArrayList<String term) {
    ArrayList<String> stations = new ArrayList<String>();
    for (int i = 0; i < copyList.size(); i++) {
        if (copyList.get(i).toLowerCase().startsWith(term.toLowerCase())) {
            stations.add(copyList.get(i));
        }
    }
}
于 2012-12-08T11:16:15.057 回答