Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何获取AutoCompleteTextView适配器的正确ID_Android_Autocompletetextview_Android Adapter - Fatal编程技术网

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

Android 如何获取AutoCompleteTextView适配器的正确ID,android,autocompletetextview,android-adapter,Android,Autocompletetextview,Android Adapter,我是Android开发新手,遇到了一个我觉得很难解决的问题。我正在试图弄清楚如何正确使用AutoCompleteTextView小部件。我想使用web服务中的XML数据创建一个自动完成文本视图。我设法让它工作,但我对输出感到不满意 我想将id=>名称对的HashMap放入AutoCompleteTextView中,并获取单击项的id。当我点击自动完成过滤集输出时,我想在自动完成框下面填充一个列表,我也设法开始工作 迄今为止已完成: autocomplete适用于简单的ArrayList,所有数

我是Android开发新手,遇到了一个我觉得很难解决的问题。我正在试图弄清楚如何正确使用
AutoCompleteTextView
小部件。我想使用web服务中的XML数据创建一个
自动完成文本视图
。我设法让它工作,但我对输出感到不满意

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

迄今为止已完成:

  • autocomplete适用于简单的
    ArrayList
    ,所有数据都经过过滤 正确的
  • onItemClick
    事件在单击后正确激发
  • parent.getItemAtPosition(位置)
    返回正确的
    String
    单击项的表示形式
事件
onItemClick(AdapterView父对象、视图v、int位置、长id)
的行为与我所希望的不同。如何计算单击项的未筛选数组位置?过滤后的位置是我不感兴趣的位置

其他问题:

  • 如何在
    AutoCompleteTextView
  • 如何在
    onItemClick
    事件中获取正确的
    itemId
我对这个问题做了非常广泛的研究,但没有找到任何有价值的信息来回答我的问题

事件名为MClick(AdapterView父项、视图v、int位置、long id)的行为不符合我的要求

这是筛选适配器时的正常情况。尽管适配器从其角度保留对初始未过滤数据的引用,但它有一组基于的数据(无论是初始数据还是由过滤操作产生的数据)。但这不应该引起任何问题。使用默认sdk适配器(或子类),在
onItemClick()
中,您可以获得适配器所基于的当前列表的
位置。然后,您可以使用
getItem()
来获取该
位置的数据项(同样,初始或筛选都没有关系)

这将适用于列表和
映射
(假设您使用
simpledapter
)。对于
贴图
,您始终可以选择添加一个附加键来设置初始列表中未过滤的位置

如果您将自己的适配器与
AutoCompleteTextView
一起使用,则可以使
onItemClick()
为您提供正确的
id
(但位置无法更改)

public类SpecialAutoComplete扩展了AutoCompleteTextView{
公共SpecialUtoComplete(上下文){
超级(上下文);
}
@凌驾
已完成的公共无效过滤器(整数计数){
//当适配器完成筛选时,将调用此函数
//操作,并通知AutoCompleteTextView
long[]realIds=new long[count];//这将保存地图中的真实ID
for(int i=0;i
和适配器:

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

}
公共类SimpleAdapterExtension扩展SimpleAdapter{

私有列表使用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;
        }

    }
公共类SimpleAtoCompleteAdapter扩展了ArrayAdapter{
私有字符串[]mData;
私有int[]mCurrentIds;
公共SimpleAutoCompleteAdapter(上下文上下文,int textViewResourceId,
字符串[]对象){
超级(上下文、textViewResourceId、对象);
mData=对象;
}
@凌驾
公共长getItemId(int位置){
字符串数据=getItem(位置);
int index=Arrays.asList(mData).indexOf(data);
/*
*注意,如果列表中有多个相同的字符串,则必须在此处进行改进
*/
//这将用于获取提供给onItemClick回调的id
如果(索引>0)
返回(长)mCurrentIds[索引];
否则返回0;
}
@凌驾
公共布尔表ID(){
返回true;
}
公共void setRealIds(int[]realIds){
mCurrentIds=realIds;
}
}

为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 ;)
     }
});
actvCity.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
int index=cityNames.indexOf(actvCity.getText().toString());
//做你想做的事;)
}
});

首先将数据添加到自定义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);
//用于将自定义数据添加到模型中的mList
private List mList=new ArrayList();
//listdata用于添加自动完成的字符串数据。
ArrayList listdata=新的ArrayList();
for(int i=0;iactvCity.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 ;)
     }
});
    // 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();
            }
        });