美好的一天。我有一个Android应用程序,用户可以使用AutoCompleteTextView
来选择名称。用户可以选择名称,然后详细信息(例如地址)将出现在下一个活动中。我所做的是,当用户选择一个名字时,我从ArrayList
获取该名称的位置,然后转到我的地址数组列表,获取相同位置的地址,然后我有我的数据。
但是,有些名称往往会重复,例如,我有一个Name ArrayList:
[A, B, B, C]
和一个Address ArrayList如下:
[Address A, Address B, Address C, Address D]
当用户点击AutoCompleteTextView中的第二个B时,返回的位置将是第一个B的位置,而不是第二个B,因此,它将给出地址B而不是地址C.
我环顾四周,并尝试为我的ArrayAdapter
设置自定义AutoCompleteTextView
,以显示名称和地址的自定义类。但是,我没有太多运气。
我接下来要研究的是使用此StackOverflow Question中显示的HashMap<String, String>
。它与用于Custom ListView的内容非常相似,只是它具有getFilter
功能。我试图改变这样的代码:
public class actvMapFilter extends
ArrayAdapter<Map<String, String>> implements Filterable {
private Context mContext;
private List<Map<String, String>> mClientList;
private List<Map<String, String>> mMutableList;
public actvMapFilter(Context context,
List<Map<String, String>> objects) {
super(context, android.R.layout.simple_list_item_1, objects);
mContext = context;
mClientList = objects;
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(android.R.layout.simple_dropdown_item_1line, null);
}
TextView nameView = (TextView) v.findViewById(android.R.id.text1);
if(position < mClientList.size()){
Map<String, String> clientMap = mClientList.get(position);
nameView.setText(clientMap.keySet().toArray()[position].toString());
}
return v;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
if (results.count > 0) {
mClientList = (ArrayList<Map<String, String>>) results.values;
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
ArrayList<Map<String, String>> result = new ArrayList<Map<String, String>>();
HashMap<String,String> myMap = new HashMap<String,String>();
if(constraint != null && mClientList!=null){
int length = mClientList.size();
int i = 0;
Log.e("","constraint = " + constraint.toString().toUpperCase());
Log.e("","constraint and list not null.");
Log.e("","length of original list = " + length);
while(i < length){
String key = mClientList.get(i).keySet().toArray()[0].toString();
String value = mClientList.get(i).values().toArray()[0].toString();
if(key.contains(constraint.toString().toUpperCase())){
myMap.put(key, value);
result.add(myMap);
}
i++;
}
Log.e("","filter results = " + myMap);
Log.e("","filter results count = " + myMap.size());
filterResults.values = result;
filterResults.count = result.size();
}
FilterResults r = new FilterResults();
r.values = result;
r.count = result.size();
return r;
}
};
}
}
它与标记为答案的内容非常相似。但是,我在getFilter
函数中所做的是,当我给出constraint
时,我会检查key
部分是否包含约束,我添加了这些约束。
这很好用,我的LogCat告诉我,如果我输入某个字符,我生成的HashMap将只包含带约束的条目。
但是,当我输入第二个后续字符时,过滤器似乎不再起作用了。我得到一个空白的过滤结果HashMap,下拉菜单反映了空白结果,因为我没有任何暗示性文本了。
有谁能告诉我如何正确实现Filterable ArrayAdapter?很感谢任何形式的帮助。谢谢。