我是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
Collections
或AutoCompleteTextView
itemId
活动onItemClick
我对这个问题进行了非常广泛的研究,但没有找到任何可以回答我问题的有价值的信息。
答案 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
,您始终可以选择添加其他键以在初始列表中设置未过滤的位置。
如果你使用自己的适配器和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
如果您还为适配器实现了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();
}
});