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关闭并显示。