AutoCompleteTextView过滤器问题 [英] AutoCompleteTextView filter problem
问题描述
我有一个 AutoCompleteTextView
和自定义AutoCompleteTextView适配器。
我的列表中有20个项目,所有项目包含沃达丰字符串。当我键入 AutoCompleteTextView
一个字符,它显示的结果和第二,它不会显示在列表。 例如;
< BR /> - > V
< BR /> - >出现自动完成下拉菜单
< BR /> - >武
< BR /> - >自动完成下拉消失
< BR /> - >点播
< BR /> - >出现自动完成下拉菜单
< BR /> - >沃达
< BR /> - >自动完成下拉消失
< BR /> ...等
为什么发生?有什么建议?
这是我的适配器:
包listadapters;
进口的java.util.ArrayList;
进口java.util.Locale中;
进口objects.Item;
进口utils.Logging;
进口android.content.Context;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.Filter;
进口android.widget.Filterable;
公共类AutoCompleteTextAdapter2扩展了BaseAdapter实现过滤的{
语境_context;
ArrayList的<项目> _items =新的ArrayList<项目>();
公共AutoCompleteTextAdapter2(上下文的背景下,ArrayList的<项目>项目){
_context =背景;
的for(int i = 0; I< items.size();我++){
_items.add(新项目(items.get(我)));
}
的for(int i = 0; I< _items.size();我++){
orig.add(新项目(_items.get(我)));
}
过滤器=新ItemFilter();
}
@覆盖
公众诠释getCount将(){
如果(_items!= NULL)
返回_items.size();
其他
返回0;
}
@覆盖
公共对象的getItem(INT为arg0){
返回_items.get(为arg0);
}
@覆盖
众长getItemId(INT为arg0){
返回0;
}
@覆盖
公共查看getView(INT为arg0,查看ARG1,ARG2的ViewGroup){
查看GV;
如果(ARG1 == NULL){
GV =新景(_context);
}其他 {
GV =(查看)ARG1;
}
返回GV;
}
@覆盖
公共过滤用getFilter(){
返回过滤器;
}
私人ItemFilter过滤器;
ArrayList的<项目>原稿=新的ArrayList<项目>();
私有类ItemFilter扩展过滤器{
公共ItemFilter(){
}
ArrayList的<项目>结果=新的ArrayList<项目>();
@覆盖
保护FilterResults performFiltering(CharSequence的约束){
如果(约束!= NULL)
Logging.TraceMessage(constraint.toString(),**,1);
FilterResults oReturn =新FilterResults();
如果(原稿== NULL){
的for(int i = 0; I< _items.size();我++){
orig.add(新项目(_items.get(我)));
}
}
如果(约束!= NULL){
results.clear();
如果(原稿=空&安培;!&安培;原稿尺寸()大于0){
为(项目一:原稿){
如果(i._itemName.toLowerCase(Locale.US)。载(constraint.toString()。与toLowerCase(Locale.US))){
results.add(新(i)项);
}
}
}
Logging.TraceMessage(将String.valueOf(results.size()),**,2);
oReturn.values =结果;
}
返回oReturn;
}
@燮pressWarnings(未登记)
@覆盖
保护无效publishResults(CharSequence的约束,FilterResults结果){
_items.clear();
对(INT I = 0; I&≤((的ArrayList&其中;项目&GT)results.values).size();我++){
_items.add(新项目(((ArrayList中<项目>)results.values)获得(一)));
}
notifyDataSetChanged();
}
}
}
并设置适配器code:
AutoCompleteTextAdapter2适配器=新AutoCompleteTextAdapter2(myAct,GlobalVariables.currCategoryItems);
yeniMarkaModel.setAdapter(适配器);
您必须将你过滤了 FilterResults.count
的项目数返回你的结果之前。文本控件分配这么多线下拉。
这样做的原因是, AutoCompleteTextView
从来没有使用值
字段直接,而是问你的适配器
来获取的项目与一个特定的指数。这使得,例如,总是通过项目的整个集合值
,但只返回有些是从 Adapter.getItem()
。
I have aAutoCompleteTextView
and a custom AutoCompleteTextView adapter.
my list has 20 items and All items contains "vodafone" string. When i type one character in AutoCompleteTextView
, it shows the results and on second, it does not shows the list. For example;
<br/>->V
<br/>-->AutoComplete DropDown menu appears
<br/>->Vo
<br/>-->AutoComplete DropDown disappears
<br/>->Vod
<br/>-->AutoComplete DropDown menu appears
<br/>->Voda
<br/>-->AutoComplete DropDown disappears
<br/>...etc
Why it's happening? Any suggestions?
here is my adapter:
package listadapters;
import java.util.ArrayList;
import java.util.Locale;
import objects.Item;
import utils.Logging;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
public class AutoCompleteTextAdapter2 extends BaseAdapter implements Filterable {
Context _context;
ArrayList<Item> _items = new ArrayList<Item>();
public AutoCompleteTextAdapter2(Context context, ArrayList<Item> items) {
_context = context;
for (int i = 0; i < items.size(); i++) {
_items.add(new Item(items.get(i)));
}
for (int i = 0; i < _items.size(); i++) {
orig.add(new Item(_items.get(i)));
}
filter = new ItemFilter();
}
@Override
public int getCount() {
if (_items != null)
return _items.size();
else
return 0;
}
@Override
public Object getItem(int arg0) {
return _items.get(arg0);
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
View gv;
if (arg1 == null){
gv = new View(_context);
}else {
gv = (View) arg1;
}
return gv;
}
@Override
public Filter getFilter() {
return filter;
}
private ItemFilter filter;
ArrayList<Item> orig = new ArrayList<Item>();
private class ItemFilter extends Filter {
public ItemFilter() {
}
ArrayList<Item> results = new ArrayList<Item>();
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if(constraint != null)
Logging.TraceMessage(constraint.toString(), "**", "1");
FilterResults oReturn = new FilterResults();
if (orig == null){
for (int i = 0; i < _items.size(); i++) {
orig.add(new Item(_items.get(i)));
}
}
if (constraint != null){
results.clear();
if (orig != null && orig.size() > 0) {
for (Item i : orig) {
if (i._itemName.toLowerCase(Locale.US).contains(constraint.toString().toLowerCase(Locale.US))){
results.add(new Item(i));
}
}
}
Logging.TraceMessage(String.valueOf(results.size()), "**", "2");
oReturn.values = results;
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
_items.clear();
for(int i = 0; i < ((ArrayList<Item>)results.values).size(); i++){
_items.add(new Item(((ArrayList<Item>)results.values).get(i)));
}
notifyDataSetChanged();
}
}
}
and set adapter code:
AutoCompleteTextAdapter2 adapter = new AutoCompleteTextAdapter2(myAct, GlobalVariables.currCategoryItems);
yeniMarkaModel.setAdapter(adapter);
You MUST assign the number of items you filtered to the FilterResults.count
before you return your results. The text control allocates this many lines for the drop-down.
The reason for this is that the AutoCompleteTextView
never uses the values
field directly but rather asks your Adapter
to fetch an item with a specific index. This makes it possible, for instance, to always pass the whole collection of items to values
but only return some of them from Adapter.getItem()
.
这篇关于AutoCompleteTextView过滤器问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!