如何获取AutoCompleteTextView适配器的正确ID

时间:2012-07-17 12:37:15

标签: android autocompletetextview android-adapter

我是Android开发的新手,遇到了一个难以解决的问题。我试图弄清楚如何正确使用AutoCompleteTextView小部件。我想使用来自Web服务的XML数据创建AutoCompleteTextView。我设法让它工作,但我对输出肯定不满意。

我想将HashMap与id =>放在一起将名称对配入AutoCompleteTextView并获取所单击项目的ID。当我点击自动完成过滤集输出时,我想在自动完成框下面填充一个列表,我也设法开始工作。

到目前为止:

  • 自动填充适用于简单的ArrayList,所有数据都已过滤 正确
  • 点击后,
  • onItemClick事件正常触发
  • parent.getItemAtPosition(position)返回正确的String 所点击项目的表示

事件onItemClick(AdapterView parent, View v, int position, long id)的行为不符合我的要求。如何确定所点击项目的未过滤数组位置?过滤后的位置是我不感兴趣的位置。

进一步的问题:

  • 如何处理HashMaps
  • 中的CollectionsAutoCompleteTextView
  • 如何在itemId活动
  • 中获得正确的onItemClick

我对这个问题进行了非常广泛的研究,但没有找到任何可以回答我问题的有价值的信息。

4 个答案:

答案 0 :(得分:13)

  

事件onItemClick(AdapterView父级,View v,int位置,长   id)不按我的意愿行事。

过滤适配器时这是正常情况。尽管适配器从其视点保留对初始未过滤数据的引用,但它具有基于的单组数据(无论是初始数据还是由过滤操作产生的)。但这不应该引起任何问题。使用默认的sdk适配器(或子类),在onItemClick()中,您获得适配器所基于的当前列表的position。然后,您可以使用getItem()获取该position的数据项(如果初始化或已过滤,则无关紧要)。

String data = getItem(position);
int realPosition = list.indexOf(data); // if you want to know the unfiltered position

这适用于列表和Maps(假设您使用SimpleAdapter)。对于Maps,您始终可以选择添加其他键以在初始列表中设置未过滤的位置。

如果你使用自己的适配器和AutoCompleteTextViewonItemClick()可以让id给你正确的public class SpecialAutoComplete extends AutoCompleteTextView { public SpecialAutoComplete(Context context) { super(context); } @Override public void onFilterComplete(int count) { // this will be called when the adapter finished the filter // operation and it notifies the AutoCompleteTextView long[] realIds = new long[count]; // this will hold the real ids from our maps for (int i = 0; i < count; i++) { final HashMap<String, String> item = (HashMap<String, String>) getAdapter() .getItem(i); realIds[i] = Long.valueOf(item.get("id")); // get the ids from the filtered items } // update the adapter with the real ids so it has the proper data ((SimpleAdapterExtension) getAdapter()).setRealIds(realIds); super.onFilterComplete(count); } } (但你无法改变位置)。

public class SimpleAdapterExtension extends SimpleAdapter {

    private List<? extends Map<String, String>> mData;
    private long[] mCurrentIds;

    public SimpleAdapterExtension(Context context,
            List<? extends Map<String, String>> data, int resource,
            String[] from, int[] to) {
        super(context, data, resource, from, to);
        mData = data;
    }

    @Override
    public long getItemId(int position) {       
        // this will be used to get the id provided to the onItemClick callback
        return mCurrentIds[position];
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    public void setRealIds(long[] realIds) {
        mCurrentIds = realIds;
    }

}

和适配器:

Filter

如果您还为适配器实现了AutoCompleTextView类,那么您可以从那里获取ID,而无需覆盖{{1}}类。

答案 1 :(得分:1)

使用Luksprog方法,我使用ArrayAdapter进行了类似的操作。

    public class SimpleAutoCompleteAdapter extends ArrayAdapter<String>{
        private String[] mData;
        private int[] mCurrentIds;

        public SimpleAutoCompleteAdapter(Context context, int textViewResourceId,
             String[] objects) {
             super(context, textViewResourceId, objects);
             mData=objects;
        }

        @Override
        public long getItemId(int position) {
            String data = getItem(position);
            int index = Arrays.asList(mData).indexOf(data);
            /*
             * Atention , if your list has more that one same String , you have to improve here  
             */
            // this will be used to get the id provided to the onItemClick callback
            if (index>0)
                return (long)mCurrentIds[index];
            else return 0;
        }

        @Override
        public boolean hasStableIds() {
            return true;
        }

        public void setRealIds(int[] realIds) {
            mCurrentIds = realIds;
        }

    }

答案 2 :(得分:1)

为AutoCompleteTextView实现onItemClickListener,然后在列表中使用indexOf查找所选项目的索引。

actvCity.setOnItemClickListener(new OnItemClickListener() {

     @Override
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
          long arg3) {
          int index = cityNames.indexOf(actvCity.getText().toString());
          // Do Whatever you want to do ;)
     }
});

答案 3 :(得分:0)

首先将您的数据添加到自定义arraylist

    // mList used for adding custom data into your model
        private List<OutletListSRModel> mList = new ArrayList<>();
      // listdata used for adding string data for auto completing.
        ArrayList<String> listdata = new ArrayList<String>();
        for (int i = 0; i < JArray.length(); i++) {
           JSONObject responseJson = JArray.getJSONObject(i);
           OutletListSRModel mModel = new OutletListSRModel();
           mModel.setId(responseJson.getString("id"));
           mModel.name(responseJson.getString("outlet_name"));
           listdata.add(responseJson.getString("outlet_name"));
        }

    ArrayAdapter adapter = new
                            ArrayAdapter(getActivity(),
 android.R.layout.simple_list_item_1, listdata);
    searchOutletKey.setAdapter(adapter);

现在从我们上面添加的模型中获取任何值。我们可以这样。

searchOutletKey.setOnItemClickListener ( new AdapterView.OnItemClickListener ( ) {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String txtOutletId = mOutletListSRModel.get(position).getId();
            }
        });