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

sar*_*ath 5 android autocompletetextview android-adapter

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

我想将一个HashMap带有id => name对的内容添加到AutoCompleteTextView中,并获取所单击项的id.当我点击自动完成过滤集输出时,我想填充自动完成框下面的列表,我也设法开始工作.

到目前为止:

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

事件onItemClick(AdapterView parent, View v, int position, long id)并不像我想的那样.如何确定所点击项目的未过滤数组位置?过滤后的位置是我不感兴趣的位置.

进一步的问题:

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

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

Luk*_*rog 13

事件onItemClick(AdapterView父,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
Run Code Online (Sandbox Code Playgroud)

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

如果你使用自己的适配器,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);
    }


}
Run Code Online (Sandbox Code Playgroud)

和适配器:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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