android - AutoCompleteTextView 在 Android 2.3.5 中不显示建议

标签 android apk bytecode autocompletetextview compiled

我正在使用一个特殊的自动完成 TextView 来获取数千条街道的建议。由于这个巨大的元素列表,我必须根据第一个输入字母即时清除和填充适配器。例如,当用户输入“b”时,适配器将填充所有以“b”开头的街道。这适用于所有 Android 版本。今天一位用户告诉我,Android 2.3.5,Samsung Galaxy Ace 有问题。

当他开始输入字母时,没有带有建议的下拉菜单。 当他输入“b”时,它只建议由两个名称组成的街道,而第二个名称以“b”开头。例如:他得到的关于“b”的建议是“Am Bahnhof”或“Alte Bahnstraße”。似乎有一种模式,但我无法解释这是如何发生的,也无法在任何模拟器或真实设备上重现(而且没有 2.3.5 模拟器)。

下面是代码。仅供引用:我必须在 beforeTextChange 中清除,否则当我很快删除字段中的输入时应用程序会崩溃。显然它不能足够快地交换列表。我需要变量 alreadyAdded,否则当我删除输入到第一个字母时它会添加列表两次。

真正奇怪的是:自从第一个实现以来我从未更改过这部分,用户告诉我它在第一个版本中工作。但是突然间它不再起作用了。编译后的代码是否有可能以某种方式损坏?有什么想法吗?

如果有人能告诉我如何重现这个问题,我也会接受一个解决方案。

调用:

autoCompleteTextView.addTextChangedListener(new StreetTextWatcher(adapter));

街道阵列适配器:

public class StreetArrayAdapter extends ArrayAdapter<String> {

    public StreetArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    public void addAll(String[] streets) {
        for (String street : streets) {
            add(street);
        }
    }
}

街头文字观察者:

public class StreetTextWatcher implements TextWatcher {

    private final StreetArrayAdapter adapter;
    private boolean alreadyAdded = false;

    public StreetTextWatcher(StreetArrayAdapter adapter) {
        this.adapter = adapter;
    }

    @Override
    public void afterTextChanged(Editable s) {
        //not used
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        if (s.length() < 1)  {
            adapter.clear();

            alreadyAdded = false;
        }
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {           
        if (s.length() == 1) {
            populateAdapter(s);

            alreadyAdded = true;
        }
    }

    private void populateAdapter(CharSequence s) {  
        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("a") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_A);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("ä") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_A);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("b") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_B);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("c") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_C);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("d") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_D);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("e") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_E);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("f") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_F);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("g") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_G);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("h") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_H);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("i") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_I);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("j") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_J);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("k") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_K);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("l") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_L);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("m") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_M);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("n") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_N);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("o") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_O);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("ö") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_O);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("p") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_P);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("q") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_Q);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("r") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_R);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("s") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_S);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("t") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_T);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("u") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_U);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("ü") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_U);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("v") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_V);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("w") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_W);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("y") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_Y);
        }

        if (s.toString().toLowerCase(Locale.GERMAN).startsWith("z") && !alreadyAdded)  {
            adapter.addAll(StreetNames.STREETS_Z);
        }
    }
}

最佳答案

我发表了关于优化的评论......但由于我正在粘贴代码......我想保留格式所以我将粘贴作为答案,即使这不能回答你的问题。

下面是我编写代码的方式,以便更轻松地更改/添加/维护...

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) 
{           
    if (s.length() == 1) 
    {
        if (!alreadyAdded)
        {
            alreadyAdded = true;
            populateAdapter(s);
        }
    }
}

private void populateAdapter(CharSequence s) {  
    Object arr[][] = 
    {{"a", StreetNames.STREETS_A },
     {"ä", StreetNames.STREETS_A },
     {"b", StreetNames.STREETS_B },
     {"c", StreetNames.STREETS_C },
     {"d", StreetNames.STREETS_D },
     {"e", StreetNames.STREETS_E },
     {"f", StreetNames.STREETS_F },
     {"g", StreetNames.STREETS_G },
     {"h", StreetNames.STREETS_H },
     {"i", StreetNames.STREETS_I },
     {"j", StreetNames.STREETS_J },
     {"k", StreetNames.STREETS_K },
     {"l", StreetNames.STREETS_L },
     {"m", StreetNames.STREETS_M },
     {"n", StreetNames.STREETS_N },
     {"o", StreetNames.STREETS_O },
     {"ö", StreetNames.STREETS_O },
     {"p", StreetNames.STREETS_P },
     {"q", StreetNames.STREETS_Q },
     {"r", StreetNames.STREETS_R },
     {"s", StreetNames.STREETS_S },
     {"t", StreetNames.STREETS_T },
     {"u", StreetNames.STREETS_U },
     {"ü", StreetNames.STREETS_U },
     {"v", StreetNames.STREETS_V },
     {"w", StreetNames.STREETS_W },
     {"y", StreetNames.STREETS_Y },
     {"z", StreetNames.STREETS_Z }};

    for (int i=0; i<arr.length; i++)
    {
        if (s.toString().toLowerCase(Locale.GERMAN).startsWith(arr[i][0]))  {
            adapter.addAll(arr[i][1]);
            break;
        }
    }
}

关于android - AutoCompleteTextView 在 Android 2.3.5 中不显示建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14590384/

相关文章:

android - 在导航组件中隐藏工具栏或底部导航栏

android - 在工具栏的自定义布局中找不到切换兼容性的引用

android - 开始时调试apk的Gradle任务

android - 安装 apk 时的 INSTALL_FAILED_NO_MATCHING_ABIS

java - 直接编辑 .class 文件,使用操作码

java - 反编译器返回的仅注释方法是什么?

java - android 在运行时替换方法调用

Android RecyclerView EditText更新错误的行

android - 在Android上准确播放周期性声音

构建 APK 时出现 Android Dex 错误