EditText在Simpleadapter上搜索过滤器?

时间:2012-10-05 13:20:58

标签: android

所以我设置了SimpleAdapter,我想在其上方添加editText,您可以输入搜索查询并实时更新列表。

我知道我已经可以setTextFilterEnabled(true)并强制键盘弹出。当你按下editText并完成它时我就会这样做。

我遇到的问题是,当你搜索时弹出字母的盒子实在是太丑了。它占据了屏幕的1/4,覆盖了搜索结果。有没有办法定制这个?在这种情况下,是否可以使用editText作为simpleAdapter,以便我可以完全删除该框?

2 个答案:

答案 0 :(得分:0)

您必须使用addTextChangedListener添加TextWatcher

Boolean[] isPresent;

ed = (EditText) findViewById(R.id.editText1);
    ed.addTextChangedListener(new TextWatcher() {

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub

            }

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

            }

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

                textLength = ed.getText().length();
                list.clear();
                isPresent = initIsPresentArray();

                for (int i = 0; i < tempList.length; i++) {
                    for (int j = 0; j < (tempList[i].length() - (textLength - 1)); j++) {
                        if (textLength <= tempList[i].length()) {
                            if (isPresent[i] == false) {
                                if (ed.getText()
                                        .toString()
                                        .equalsIgnoreCase(
                                                (String) tempList[i]
                                                        .subSequence(
                                                                j,
                                                                (j + textLength)))) {
                                    list.add(tempCaseList.get(i));
                                    isPresent[i] = true;
                                }
                            }
                        }
                    }
                    if (list.size() == 0) {
                        error.setText(getResources().getString(R.string.notFound));
                    } else {
                        error.setText("");
                    }

                    lv.setAdapter(new CustomAdapter(History.this, list));
                }
            }
        });

方法initIsPresentArray()

 public Boolean[] initIsPresentArray() {
            Boolean[] isPresent = new Boolean[tempCaseList.size()];
            for (int i = 0; i < isPresent.length; i++) {
                isPresent[i] = false;
            }
            return isPresent;
        }

正如您所看到的,我不直接对包含该信息的ArrayList进行操作,但我使用此方法将此ArrayList复制到临时ArrayList

public ArrayList<Case> createTempList(ArrayList<Case> listOfCases) {

    ArrayList<Case> temporaryList = new ArrayList<Case>();

    for (Case c : listOfCases) {
        temporaryList.add(c);
    }

    return temporaryList;
}

如果有些事情未清除,请添加评论!

答案 1 :(得分:0)

虽然托比亚斯的回答很有见地,但它没有回答我的问题,而且我需要做的事情相当复杂。我没有每次都清理并重新加载列表,而是选择在阵列适配器中使用一个自动执行所有操作的过滤器:

This is the article帮助我做到了,它非常有用。