【问题标题】:AutoCompleteTextView hides and shows dropdown list when text changesAutoCompleteTextView 在文本更改时隐藏和显示下拉列表
【发布时间】:2015-07-19 21:53:16
【问题描述】:

我有一个AutoCompleteTextView,它显示了推荐的视频。当用户在其中输入文本时,我的应用程序会根据文本用户类型从服务器获取数据。但是当用户更改文本(逐个字符输入)时,下拉菜单会自动关闭。然后我得到数据并再次显示下拉菜单。所以我的下拉菜单被解雇并立即显示。它会对用户造成不良影响(尤其是当用户快速输入时)
当用户更改文本时,如何避免下拉菜单被关闭。 这样当我从服务器获取数据时,我可以调用 myAdapter.notifyDataChanged()。

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

【问题讨论】:

标签: android autocompletetextview


【解决方案1】:

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

试试这个:

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;
    }
}

【讨论】:

    【解决方案2】:

    这是我的解决方案。

    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;
        }   
    }
    

    因为我从服务器获取数据。所以在performFiltering,我只返回一个非空对象。
    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      我猜到了,您正在根据自动完成文本视图中的字符串从服务器获取数据列表。以便适配器在文本更改时加载过滤列表。尝试实现 CursorAdapter。它是您问题的更好解决方案。请尝试告诉我。

      【讨论】:

      • 是的...我必须覆盖适配器中的 getFilter(),扩展 AutoCompleteTextView 并覆盖 enoughToFilter() 以始终返回 true。所以这可以防止 AutoCompleteTTextView 关闭和显示。
      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多