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

时间:2013-12-12 11:37:44

标签: android autocompletetextview

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

提前致谢。 P / S:我听说解决方案是扩展AutoCompleteTextView。但我不知道那样做。

3 个答案:

答案 0 :(得分:1)

这是我的解决方案。

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中,我只返回一个非空对象 希望对你有所帮助。

答案 1 :(得分:1)

在适配器中实现Filterable,并使用Filter。

试试这个:

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 :(得分:0)

我猜测,您将根据自动完成文本视图中的字符串从服务器获取数据列表。这样适配器就会在文本发生变化时加载已过滤的列表。尝试实现CursorAdapter。它是解决您问题的更好方案。试试让我知道。