Android 使用过滤器自动完成文本视图
Android Autocomplete text view with filter
我正在使用自动完成文本视图按任何字母进行过滤。
这个概念是可行的,但是当我输入每个字母时,应用程序会冻结或延迟一段时间。
同样在删除时,也会发生同样的情况。我究竟做错了什么?有什么遗漏吗?下面添加了我的适配器 class。
提前致谢。
public class ListAccNoAdapter extends ArrayAdapter<ListAccNo> {
Context context;
int resource, textViewResourceId;
List<ListAccNo> items, tempItems, suggestions;
public ListAccNoAdapter(Context context, int resource, int
textViewResourceId, List<ListAccNo> items) {
super(context, resource, textViewResourceId, items);
this.context = context;
this.resource = resource;
this.textViewResourceId = textViewResourceId;
this.items = items;
tempItems = new ArrayList<ListAccNo>(items); // this makes the
difference.
suggestions = new ArrayList<ListAccNo>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.row_item, parent, false);
}
ListAccNo accnum = items.get(position);
if (accnum != null) {
TextView lblName = (TextView) view.findViewById(R.id.lbl_name);
if (lblName != null)
lblName.setText(accnum.getName());
}
return view;
}
@Override
public Filter getFilter() {
return nameFilter;
}
/**
* Custom Filter implementation for custom suggestions we provide.
*/
Filter nameFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
String str = ((ListAccNo) resultValue).getName();
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
List<ListAccNo> suggestions = new ArrayList<ListAccNo>();
FilterResults filterResults = new FilterResults();
for (ListAccNo accno : tempItems) {
if (accno.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(accno);
}
}
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults
results) {
List<ListAccNo> filterList = (ArrayList<ListAccNo>)
results.values;
if (results != null && results.count > 0) {
clear();
for (ListAccNo accnum : filterList) {
add(accnum);
notifyDataSetChanged();
}
}
}
};
}
我使用了 AutoCompleteTextView 并且它工作正常。
我首先将要在 AutoCompleteTextView 中呈现的内容放在 String 数组中。
然后我在 AutoCompleteTextView 中设置了适配器内容。
String[] arr=["a","b","c","d"]; // array contents
ArrayAdapter<String> adapter=new ArrayAdapter<String>
(this,android.R.layout.simple_dropdown_item_1line,arr);
AutoCompleteTextView autoCompleteTextView=
(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);
autoCompleteTextView.setThreshold(1);
autoCompleteTextView.setAdapter(adapter);
@Override
protected void publishResults(CharSequence constraint, FilterResults
results) {
List<ListAccNo> filterList = (ArrayList<ListAccNo>)
results.values;
if (results != null && results.count > 0) {
clear();
for (ListAccNo accnum : filterList) {
add(accnum);
//remove from here notifyDataSetChanged();
}
// put here notifyDataSetChanged();
}
}
};
检查你的代码,你在 notifyDataSetChanged
循环内,我认为它会通知每个项目,这就是为什么冻结的原因,你能否检查以从内部循环中删除它并在完成后通知loop.I 认为它会起作用。
问题已解决。
在 MainActivity 中设置适配器时,我给了一个步骤
autotextview.setThreshold(1);
删除这行代码解决了问题。
感谢大家的帮助
我正在使用自动完成文本视图按任何字母进行过滤。 这个概念是可行的,但是当我输入每个字母时,应用程序会冻结或延迟一段时间。 同样在删除时,也会发生同样的情况。我究竟做错了什么?有什么遗漏吗?下面添加了我的适配器 class。 提前致谢。
public class ListAccNoAdapter extends ArrayAdapter<ListAccNo> {
Context context;
int resource, textViewResourceId;
List<ListAccNo> items, tempItems, suggestions;
public ListAccNoAdapter(Context context, int resource, int
textViewResourceId, List<ListAccNo> items) {
super(context, resource, textViewResourceId, items);
this.context = context;
this.resource = resource;
this.textViewResourceId = textViewResourceId;
this.items = items;
tempItems = new ArrayList<ListAccNo>(items); // this makes the
difference.
suggestions = new ArrayList<ListAccNo>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.row_item, parent, false);
}
ListAccNo accnum = items.get(position);
if (accnum != null) {
TextView lblName = (TextView) view.findViewById(R.id.lbl_name);
if (lblName != null)
lblName.setText(accnum.getName());
}
return view;
}
@Override
public Filter getFilter() {
return nameFilter;
}
/**
* Custom Filter implementation for custom suggestions we provide.
*/
Filter nameFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
String str = ((ListAccNo) resultValue).getName();
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
List<ListAccNo> suggestions = new ArrayList<ListAccNo>();
FilterResults filterResults = new FilterResults();
for (ListAccNo accno : tempItems) {
if (accno.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(accno);
}
}
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults
results) {
List<ListAccNo> filterList = (ArrayList<ListAccNo>)
results.values;
if (results != null && results.count > 0) {
clear();
for (ListAccNo accnum : filterList) {
add(accnum);
notifyDataSetChanged();
}
}
}
};
}
我使用了 AutoCompleteTextView 并且它工作正常。 我首先将要在 AutoCompleteTextView 中呈现的内容放在 String 数组中。 然后我在 AutoCompleteTextView 中设置了适配器内容。
String[] arr=["a","b","c","d"]; // array contents
ArrayAdapter<String> adapter=new ArrayAdapter<String>
(this,android.R.layout.simple_dropdown_item_1line,arr);
AutoCompleteTextView autoCompleteTextView=
(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView);
autoCompleteTextView.setThreshold(1);
autoCompleteTextView.setAdapter(adapter);
@Override
protected void publishResults(CharSequence constraint, FilterResults
results) {
List<ListAccNo> filterList = (ArrayList<ListAccNo>)
results.values;
if (results != null && results.count > 0) {
clear();
for (ListAccNo accnum : filterList) {
add(accnum);
//remove from here notifyDataSetChanged();
}
// put here notifyDataSetChanged();
}
}
};
检查你的代码,你在 notifyDataSetChanged
循环内,我认为它会通知每个项目,这就是为什么冻结的原因,你能否检查以从内部循环中删除它并在完成后通知loop.I 认为它会起作用。
问题已解决。 在 MainActivity 中设置适配器时,我给了一个步骤
autotextview.setThreshold(1);
删除这行代码解决了问题。
感谢大家的帮助