我想过滤autocompletetextview中的文字。当我开始输入文本而不是显示过滤的文本时,它显示完整的文本列表。我的意思是它不会过滤列表。
请帮我解决这个问题。我试过但无法识别问题
public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
private ArrayList<String> mData;
public AutoCompleteAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
mData = new ArrayList<String>();
mData.add("one");
mData.add("oneee");
mData.add("two");
}
@Override
public int getCount() {
return mData.size();
}
@Override
public String getItem(int index) {
return mData.get(index);
}
@Override
public Filter getFilter() {
Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<String> resultsSuggestions = new ArrayList<String>();
if(constraint != null) {
for (int i = 0; i < getCount(); i++) {
if(getItem(i).toString().startsWith(constraint.toString())){
resultsSuggestions.add(getItem(i).toString());
}
}
}
FilterResults results = new FilterResults();
results.values = resultsSuggestions;
results.count = resultsSuggestions.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
try {
ArrayList<String> newValues = (ArrayList<String>) results.values;
for (int i = 0; i < newValues.size(); i++) {
add(newValues.get(i));
}
if(results != null && results.count > 0) {
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
} catch(Exception e) {
Log.v("Near ATM", "Exception ::" + e.getMessage());
}
}
};
return myFilter;
}
}
答案 0 :(得分:0)
我会说你的问题出在publishResults
方法中。即使notifyDataSetChanged()
,您也应该致电result.count == 0
。您的getItem
和getCount
方法应与过滤列表配合使用。所以你的代码应该是这样的:
public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
private ArrayList<String> fullList;
private ArrayList<String> filtredList;
public AutoCompleteAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
filtredList = new ArrayList<String>();
fullList = new ArrayList<String>();
fullList.add("one");
fullList.add("oneee");
fullList.add("two");
}
@Override
public int getCount() {
return filtredList.size();
}
@Override
public String getItem(int index) {
return filtredList.get(index);
}
@Override
public Filter getFilter() {
Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
List<String> resultsSuggestions = new ArrayList<String>();
if(constraint != null) {
for (int i = 0; i < fullList.size(); i++) {
if(fullList.get(i).startsWith(constraint.toString())){
resultsSuggestions.add(fullList.get(i));
}
}
}
FilterResults results = new FilterResults();
results.values = resultsSuggestions;
results.count = resultsSuggestions.size();
filtredList = resultsSuggestions;
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
try {
ArrayList<String> newValues = (ArrayList<String>) results.values;
for (int i = 0; i < newValues.size(); i++) {
add(newValues.get(i));
}
if(results != null) {
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
} catch(Exception e) {
Log.v("Near ATM", "Exception ::" + e.getMessage());
}
}
};
return myFilter;
}
}