Java 如果键入了AutoCompleteTextView完整建议词,如何收听
如果键入了AutoCompleteAdapter列表中的完整建议词,我想让我的片段听一听 例如,“我的列表”包含以下元素: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
{"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);
}