6

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

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

到目前为止完成:

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

该事件的onItemClick(AdapterView parent, View v, int position, long id)行为不像我想要的那样。如何找出单击项目的未过滤数组位置?过滤后的位置是我不感兴趣的。

进一步的问题:

  • 如何处理HashMapsCollectionsAutoCompleteTextView
  • 如何itemIdonItemClick活动中获得权利

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

4

4 回答 4

13

onItemClick(AdapterView parent, View v, int position, long 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您总是可以选择添加一个额外的键来设置初始列表中的未过滤位置。

如果您将自己的适配器与 an 一起使用,则AutoCompleteTextView可以使onItemClick()您获得正确的权利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适配器的类,那么您可以从那里获取 id 而无需覆盖AutoCompleTextView该类。

于 2013-06-15T10:23:18.637 回答
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;
        }

    }
于 2014-04-15T19:55:07.630 回答
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 ;)
     }
});
于 2014-11-18T09:15:06.377 回答
0

首先将您的数据添加到自定义数组列表中

    // 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();
            }
        });
于 2016-12-08T09:10:44.923 回答