java - 如果键入 AutoCompleteTextView 完整建议词,如何监听

标签 java android listener actionlistener autocompletetextview

如果键入了 AutoCompleteAdapter 列表的完整建议词,我希望我的 fragment 能够监听。

例如,我的列表包含以下元素:

{"Alireza Noorali", "Armin Yaghini", "Hassan Mirfendereski"}

用户正在 AutoCompleteTextView 中输入 Alireza Nooral,我想 dismissDropDown() 并在用户输入建议的最后一个字符时执行其他操作,即 i Alireza Noorali

我实现了一个自定义适配器,并在其 getFilter 方法中放置了一个监听器:

@NonNull
@Override
public Filter getFilter() {
    return nameFilter;
}

/*
 * Custom Filter implementation for custom suggestions we provide.
 */
private Filter nameFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence inputChars) {

        if (inputChars != null) {

            try {
                suggestions.clear();
            } catch (Exception e) {
                e.printStackTrace();
            }

            for (String acTvItem : tempItems) {
                if (acTvItem.toLowerCase().contains(inputChars.toString().toLowerCase())) {
                    suggestions.add(acTvItem);
                }

                if (listener != null && acTvItem.equalsIgnoreCase(inputChars.toString()) && results.count == 1) {
                    listener.onCompleteInputListener(key);
                }
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = suggestions;
            filterResults.count = suggestions.size();
            return filterResults;
        } else {
            return new FilterResults();
        }
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        List<String> filterList = (ArrayList<String>) results.values;
        if (results.count > 0) {
            clear();
            if (filterList != null && !filterList.isEmpty()) {
                for (String acTvItem : filterList) {
                    add(acTvItem);
                    notifyDataSetChanged();
                }
            }
        }
    }
};


/*  ---------- Interface ----------  */

public interface CompleteInputListener {
    void onCompleteInputListener(String key);
}

在我的 fragment 中,我实现了监听器方法:

private AcTvAdapter.CompleteInputListener completeInputListener() {
    return new AcTvAdapter.CompleteInputListener() {
        @Override
        public void onCompleteInputListener(String key) {

            // hideSoftKeyboard & dismissDropDown & something else
        }
    };
}

但是当我执行最初所说的场景时,我收到此警告:

W/Filter: An exception occured during performFiltering()!
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7809)
    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1338)
    at android.view.ViewGroup.invalidateChild(ViewGroup.java:5446)
    at android.view.View.invalidateInternal(View.java:14749)
    at android.view.View.invalidate(View.java:14713)
    at android.view.View.setFlags(View.java:12542)
    at android.view.View.setVisibility(View.java:8611)
    at ir.noorali.myapp.MyFrag.getCountry(MyFrag.java:662)
    at ir.noorali.myapp.MyFrag$12.onCompleteInputListener(MyFrag.java:995)
    at ir.noorali.myapp.adapters.AcTvAdapter$1.performFiltering(AcTvAdapter.java:120)
    at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.os.HandlerThread.run(HandlerThread.java:61)

我知道原因是ActionListener的声明:

Java ActionListener is an invisible GUI object that gets its method called when the user performs a certain action. Common actions include pressing the push button, toggling the toggle button, checking the checkbox, selecting an item in combo box and the like.

但我不知道如何实现我的目的。有没有其他解决方案?

最佳答案

正如@pskink在评论中所说,我在publishResults上调用了onCompleteInputListener,问题就解决了。这是我的新代码:

@NonNull
@Override
public Filter getFilter() {
    return nameFilter;
}

/*
 * Custom Filter implementation for custom suggestions we provide.
 */
private Filter nameFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence inputChars) {

        if (inputChars != null) {

            try {
                suggestions.clear();
            } catch (Exception e) {
                e.printStackTrace();
            }

            for (String acTvItem : tempItems) {
                if (acTvItem.toLowerCase().contains(inputChars.toString().toLowerCase())) {
                    suggestions.add(acTvItem);
                }
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = suggestions;
            filterResults.count = suggestions.size();
            return filterResults;
        } else {
            return new FilterResults();
        }
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        List<String> filterList = (ArrayList<String>) results.values;
        if (results.count > 0) {
            clear();
            if (filterList != null && !filterList.isEmpty()) {

                for (String acTvItem : filterList) {

                if (listener != null && acTvItem.equalsIgnoreCase(inputChars.toString()) && results.count == 1) {
                    listener.onCompleteInputListener(key);
                }

                    add(acTvItem);
                    notifyDataSetChanged();
                }
            }
        }
    }
};


/*  ---------- Interface ----------  */

public interface CompleteInputListener {
    void onCompleteInputListener(String key);
}

现在它可以在没有任何警告的情况下运行了!

关于java - 如果键入 AutoCompleteTextView 完整建议词,如何监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53578331/

相关文章:

JavaFX addListener 不工作

java - 使用 XPath 检索 XML 元素会抛出 NullPointerException

java - 为什么这个方法允许一个double存储在Integer类型的ArrayList中?

java - 如何只允许传递特定类型的格式化字符串?

android - 如何加密一个字符串,使其可以用作文件路径的一部分,然后在 Android 中解密?

javascript - 如何知道 JavaScript 中某个特定按钮何时被点击?

java - 使用什么工具包可以在绘画中制作多个线程? Swing、GWT、FX、Qt 还是什么?

android - onClick 等待 1 秒然后运行代码

Android 多个内容提供者 (DLC)

java - 当我聚焦或鼠标单击或在可编辑组合框字段中单击时,如何列出下拉列表中的所有名称