将 SearchView 用于 ListView 的位置问题 Java

Issue with position using SearchView for a ListView Java

我有一个用这些词填充的列表视图

    arrayList.add("apple");
    arrayList.add("banana");
    arrayList.add("bell");
    arrayList.add("cheese");

如果我点击一行,会出现一条消息

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Toast.makeText(getApplicationContext(), arrayList.get(position), Toast.LENGTH_SHORT).show();
        }
    });

我有一个搜索视图,可以过滤掉不是用户输入的词

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String text = editText.getText().toString().toLowerCase(Locale.getDefault());
            adapter.getFilter().filter(text);

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

如果我在搜索视图中键入 "b",则列表视图中只有 "banana" 和 "bell" 项。但是如果我点击 "banana",Toast 会显示 "apple"。我知道问题是什么以及为什么要这样做,但我不知道解决它的简单方法。

解决这个问题的一种方法是这样...

int textLength = text.length();

            if (textLength == 0) {
                test.addAll(arrayList);
            } else {

                int counter = 0;

                for (String string : arrayList) {

                    if (string.toLowerCase().substring(0, textLength).equals(text)) {
                        test.add(string);
                        intPositions.add(counter);
                    }

                    counter++;
                }
            }

如果我这样做,我的列表视图的 onClickListener 会更改为这个

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            int i = intPositions.get(position);

            Toast.makeText(getApplicationContext(), arrayList.get(i), Toast.LENGTH_SHORT).show();
        }
    });

注意:这仅在用户在单击某行之前在搜索视图中键入内容时有效。

这很好,但是如果我的 arrayList 中有 2000、3000 或 5000 个项目,这不是一个非常有效的方法。感谢任何帮助。

更改以下代码:

Toast.makeText(getApplicationContext(), arrayList.get(position), Toast.LENGTH_SHORT).show();

使用以下代码:

String text = ((TextView) view).getText().toString();
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();