2013-12-12 118 views
1

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

在此先感谢。 P/S:听说解决方案是扩展AutoCompleteTextView。但我不知道这样做。

+1

,你必须做一些错误的,因为通常ACTV犯规解雇[AutoCompleteTextView隐藏和适配器上的变化显示下拉(的下拉 – pskink

+0

可能重复http://stackoverflow.com/questions/11010442/autocompletetextview-hide-and-show-dropdown-on-adapter-change) – mixel

+0

在这里看到我的解决方案http://stackoverflow.com/questions/11010442/autocompletetextview-hide-and-show-dropdown-on-adapter-更改/ 31503409#31503409 – mixel

回答

0

这是我的解决方案。

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

0

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

+0

是的...我必须重写适配器中的getFilter(),扩展AutoCompleteTextView并重写enoughToFilter()以始终返回true。所以这可以防止AutoCompleteTExtView消除和显示。 –

+0

谢谢您的回复.. – Sripathi

+0

如果您发布示例代码,这将会很有帮助。 – Sripathi

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; 
    } 
} 
相关问题