Android - 在自定义ArrayAdapter上为AutoCompleteTextView使用HashMap <string,string =“”>不会在第一个字符后过滤

时间:2015-08-01 11:29:25

标签: android arraylist android-arrayadapter

美好的一天。我有一个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?很感谢任何形式的帮助。谢谢。

0 个答案:

没有答案