任何人都可以在我的代码中查明问题是什么。
当我按退格键时,我的AutoCompleteTextView有奇怪的行为。首先,当我在文本框中键入时,它将显示正确的值。例如,我有一个字符串列表,即“ Pallanos ”,“ Palana ”,“ Pandor ”,“ Pasdi ”。
当我输入 Pal 时,会显示 Pallanos 和 Palana 。但是当我按下退格时,建议的dropbox是 NOT 刷新。我应该得到四个结果,即上面的字符串。
继承我的适配器
class EmployeeAdapter extends ArrayAdapter<EmployeeDetails>{
Context context;
int layoutResourceId;
ArrayList<EmployeeDetails> data;
ArrayList<EmployeeDetails> objects;
//EmployeeDetails data[] = null;
public EmployeeAdapter(Context c, int paramlayoutResourceId, ArrayList<EmployeeDetails> collection) { //EmployeeDetails[] collection) {
super(c, paramlayoutResourceId, collection);
this.layoutResourceId = paramlayoutResourceId;
this.context = c;
this.data = collection;
this.objects = collection;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row == null) {
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, null);
}
EmployeeDetails emp = data.get(position);
Departments dept = new Departments(context);
AccountTypes accType = new AccountTypes(context);
((TextView) row.findViewById(R.id.tvMainHeader)).setText(emp.getFirstName() + ", " + emp.getLastName());
((TextView) row.findViewById(R.id.tvSubHeader)).setText(dept.GetDepartmentName(emp.getDepartmentID()).toString() + " - " + accType.GetAccountTypeName(emp.getAccountTypeID()).toString());
((ImageView) row.findViewById(R.id.imgHeader)).setImageResource(R.drawable.id_card);
return row;
}
@Override
public Filter getFilter() {
//return nameFilter;
Filter nameFilter = new Filter() {
public String convertResultToString(Object resultValue) {
String str = ((EmployeeDetails)(resultValue)).getLastName();
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<EmployeeDetails> suggestions = new ArrayList<EmployeeDetails>();
FilterResults filterresults = new FilterResults();
if (constraint != null) {
suggestions.clear();
for (EmployeeDetails employee : objects) {
if (employee.getLastName().toLowerCase().startsWith(constraint.toString().toLowerCase())) {
suggestions.add(employee);
}
}
filterresults.values = suggestions;
filterresults.count = suggestions.size();
}
return filterresults;
}
@Override
@SuppressWarnings("unchecked")
protected void publishResults(CharSequence constraint, FilterResults results) {
ArrayList<EmployeeDetails> filteredList = (ArrayList<EmployeeDetails>) results.values;
if (filteredList != null && filteredList.size() > 0) {
clear();
for (EmployeeDetails employee : filteredList) {
add(employee);
}
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
return nameFilter;
}
}
下面的代码展示了我如何在AutoCompleteTextView中使用适配器
EmployeeAdapter adapter = new EmployeeAdapter(this, R.layout.list_row, empFunction.GetAllEmployees());
AutoCompleteTextView empAuto = (AutoCompleteTextView)findViewById(R.id.auto_Employee);
empAuto.setThreshold(1);
empAuto.setAdapter(adapter);
答案 0 :(得分:0)
我找到了解决问题的方法。但它有点慢。如果有人可以优化,请随时发布您的答案。 :)
不是将 object
( this.objects = collection
)变量等同于我的构造函数中,而是将其放在performFiltering
中。我们的想法是每次objects
方法触发时刷新 performFiltering
变量。
有些人在TextView中添加TextWatcher
来刷新其适配器。
以下是我修改过的perFormFiltering
protected FilterResults performFiltering(CharSequence constraint) {
EmployeeDetails empFunction = new EmployeeDetails(context);
ArrayList<EmployeeDetails> suggestions = new ArrayList<EmployeeDetails>();
FilterResults filterresults = new FilterResults();
if (constraint != null) {
suggestions.clear();
objects = empFunction.GetAllEmployees();
for (EmployeeDetails employee : objects) {
if (employee.getLastName().toLowerCase().startsWith(constraint.toString().toLowerCase())) {
suggestions.add(employee);
}
}
filterresults.values = suggestions;
filterresults.count = suggestions.size();
}
return filterresults;
}
由于