Java 如果键入了AutoCompleteTextView完整建议词,如何收听

Java 如果键入了AutoCompleteTextView完整建议词,如何收听,java,android,listener,actionlistener,autocompletetextview,Java,Android,Listener,Actionlistener,Autocompletetextview,如果键入了AutoCompleteAdapter列表中的完整建议词,我想让我的片段听一听 例如,“我的列表”包含以下元素: {"Alireza Noorali", "Armin Yaghini", "Hassan Mirfendereski"} 用户正在AutoCompleteTextView中键入Alireza Nooral,当用户键入建议的最后一个字符时,我想dismissDropDown()并执行其他操作,即I将Alireza Noorali 我实现了一个自定义适配器,并在其getFil

如果键入了AutoCompleteAdapter列表中的完整建议词,我想让我的片段听一听

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

{"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);
}
但当我执行最初提到的场景时,我得到了以下警告:

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是一个不可见的GUI对象,当用户执行某个操作时,该对象将调用其方法。常见操作包括按下按钮、切换按钮、选中复选框、在组合框中选择项目等


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

正如@pskink在评论中所说,我在
publishResults
上给CompleteInputListener打了
电话,问题就解决了。这是我的新代码:

@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);
}
@NonNull
@凌驾
公共过滤器getFilter(){
返回名称过滤器;
}
/*
*我们提供的自定义建议的自定义筛选器实现。
*/
私有筛选器名称筛选器=新筛选器(){
@凌驾
受保护的筛选器结果执行筛选(CharSequence inputChars){
if(inputChars!=null){
试一试{
建议。清晰();
}捕获(例外e){
e、 printStackTrace();
}
用于(字符串activitem:tempItems){
if(acTvItem.toLowerCase().contains(inputChars.toString().toLowerCase())){
建议。添加(acTvItem);
}
}
FilterResults FilterResults=新的FilterResults();
filterResults.values=建议;
filterResults.count=建议.size();
返回过滤器结果;
}否则{
返回新的FilterResults();
}
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
List filterList=(ArrayList)results.values;
如果(results.count>0){
清除();
if(filterList!=null&&!filterList.isEmpty()){
用于(字符串acTvItem:filterList){
if(listener!=null&&acTvItem.equalsIgnoreCase(inputChars.toString())&&results.count==1){
onCompleteInputListener(键);
}
添加(acTvItem);
notifyDataSetChanged();
}
}
}
}
};
/*------接口-------*/
公共接口CompleteInputListener{
void onCompleteInputListener(字符串键);
}

现在它在没有任何警告的情况下工作

publishResults
在UI线程上被调用-因此在CompleteInputListener上调用您的
它就像一个魔咒!非常感谢。很好,欢迎光临。
yourList.contains(“Alireza Nooral”)
?@shahmdmmonirulislam感谢您所说的要点。我编辑了我的帖子,并在
if
条件中添加了
results.count==1
@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);
}