Android 文本更改时,AutoCompleteTextView隐藏并显示下拉列表

Android 文本更改时,AutoCompleteTextView隐藏并显示下拉列表,android,autocompletetextview,Android,Autocompletetextview,我有一个AutoCompleteTextView可以显示建议的视频。当用户在其中输入文本时,我的应用程序将根据文本用户类型从服务器获取数据。但是,当用户更改文本(逐个字符输入)时,下拉列表将自动取消。然后我得到数据并再次显示下拉列表。因此,我的下拉列表被删除并立即显示。它会对用户造成不良影响(尤其是当用户键入快时) 如何避免在用户更改文本时取消下拉列表。 这样,当我从服务器获取数据时,我可以调用myAdapter。notifyDataChanged() 提前谢谢。 P/S:我听说一个解决方案是扩

我有一个
AutoCompleteTextView
可以显示建议的视频。当用户在其中输入文本时,我的应用程序将根据文本用户类型从服务器获取数据。但是,当用户更改文本(逐个字符输入)时,下拉列表将自动取消。然后我得到数据并再次显示下拉列表。因此,我的下拉列表被删除并立即显示。它会对用户造成不良影响(尤其是当用户键入快时)
如何避免在用户更改文本时取消下拉列表。 这样,当我从服务器获取数据时,我可以调用myAdapter。
notifyDataChanged
()

提前谢谢。
P/S:我听说一个解决方案是扩展
AutoCompleteTextView
。但是我不知道该怎么做。

我猜,您正在根据自动完成文本视图中的字符串从服务器获取数据列表。这样,无论文本何时更改,适配器都会加载筛选列表。尝试实现游标适配器。这是解决你问题的更好办法。试着让我知道。

这是我的解决方案

public class CustomAutoCompleteTextView extends AutoCompleteTextView {

    public CustomAutoCompleteTextView(Context context) {
        this(context, null);
        // TODO Auto-generated constructor stub     
    }

    public CustomAutoCompleteTextView(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.autoCompleteTextViewStyle);
    }

    public CustomAutoCompleteTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean enoughToFilter() {
        // TODO Auto-generated method stub
        return true;
    }
}
public class SearchSuggestionAdapter extends ArrayAdapter<SearchObject>
{   
.......
@Override
    public Filter getFilter() {
        // TODO Auto-generated method stub
        Filter filter = new Filter() {
            String keyword;

            @Override
            public CharSequence convertResultToString(Object resultValue) {
                // TODO Auto-generated method stub
                return keyword;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                // TODO Auto-generated method stub
                if(results.values != null)
                    notifyDataSetChanged();
                else
                    notifyDataSetInvalidated();
            }       

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                // TODO Auto-generated method stub
                keyword = constraint.toString();
                final FilterResults filterResults = new FilterResults();
                filterResults.values = mList;
                filterResults.count = mList.size();  
                return filterResults;
};
        return filter;
    }   
}
公共类CustomAutoCompleteTextView扩展了AutoCompleteTextView{
公共CustomAutoCompleteTextView(上下文){
这个(上下文,空);
//TODO自动生成的构造函数存根
}
公共CustomAutoCompleteTextView(上下文上下文、属性集属性){
这(context、attrs、android.R.attr.autoCompleteTextViewStyle);
}
公共CustomAutoCompleteTextView(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
@凌驾
公共布尔值enoughToFilter(){
//TODO自动生成的方法存根
返回true;
}
}
公共类SearchSuggestionAdapter扩展了ArrayAdapter
{   
.......
@凌驾
公共过滤器getFilter(){
//TODO自动生成的方法存根
过滤器过滤器=新过滤器(){
字符串关键字;
@凌驾
public CharSequence ConvertResultString(对象结果值){
//TODO自动生成的方法存根
返回关键字;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
//TODO自动生成的方法存根
如果(results.values!=null)
notifyDataSetChanged();
其他的
notifyDataSetionValidated();
}       
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
//TODO自动生成的方法存根
关键字=constraint.toString();
最终FilterResults FilterResults=新的FilterResults();
filterResults.values=mList;
filterResults.count=mList.size();
返回过滤器结果;
};
回流过滤器;
}   
}
因为我从服务器获取了数据。所以在
performFiltering
中,我只返回一个非空对象。

希望对您有所帮助。

在适配器中实现可过滤,并使用过滤器

试试这个:

public class ListAdapter extends ArrayAdapter<String> implements Filterable{


    private List<String> listResult;

    ...
    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();
                if (constraint != null) {
                    // Assign the data to the FilterResults
                    filterResults.values = listResult;
                    filterResults.count = listResult.size();
                    }
                return filterResults;
                }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                if (results != null && results.count > 0) {
                    notifyDataSetChanged();
                }
                else {
                    notifyDataSetInvalidated();
                }
            }};
        return filter;
    }
}
公共类ListAdapter扩展ArrayAdapter实现可过滤{
私有列表列表结果;
...
@凌驾
公共过滤器getFilter(){
过滤器过滤器=新过滤器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults FilterResults=新的FilterResults();
if(约束!=null){
//将数据分配给FilterResults
filterResults.values=listResult;
filterResults.count=listResult.size();
}
返回过滤器结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
if(results!=null&&results.count>0){
notifyDataSetChanged();
}
否则{
notifyDataSetionValidated();
}
}};
回流过滤器;
}
}

您一定是做错了什么,因为通常ACTV不会关闭Dropdown的可能重复项“在此处查看我的解决方案”是的…我必须在适配器中重写getFilter(),扩展AutoCompleteTextView并重写enoughToFilter(),以始终返回true。因此,这会防止AutoCompleteTextView关闭并显示。