适配器工作正常,但我不明白为什么OnItemClick中的位置总是“0”
String[] regions = ct.getRegions();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, regions);
regionT.setAdapter(adapter);
regionT.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
int pos=position;
}
});
答案 0 :(得分:29)
不要问我为什么,但方法position
中的参数OnItemClickListener.onItemClick
保存相对于AutoCompleteTextView
下拉列表的索引,而不是适配器数组中的位置(in你的案件regions
)!
因此,要找到项目的真实position
,您必须在下拉列表中选择字符串并在适配器数组中找到它的索引:
String[] regions = ct.getRegions();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, regions);
regionT.setAdapter(adapter);
regionT.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String selected = (String) parent.getItemAtPosition(position);
int pos = Arrays.asList(regions).indexOf(selected);
}
});
答案 1 :(得分:0)
我遇到了同样的问题:我无法设法获得位置,但是我想出了如何检索用户选择的整个对象(如果有)的方法,该对象具有一个ID字段,在我的情况下是我所需要的
诀窍不是为建议的项目使用ArrayAdapter<String>
,而是使用ArrayAdapter<MyObject>
,其中MyObject
覆盖toString()
方法。
例如:
public class Country extends Object {
public int id;
public Country(int id) {
this.id = id;
}
@NonNull
@Override
public String toString() {
switch (id) {
case 0:
return "Albania";
case 1:
return "Romania";
case 2:
return "Ucraina";
case 3:
return "Russia";
default:
return "Unknwon";
}
}
}
...
private AutoCompleteTextView mNationAtv;
private Button mTestBtn;
private final Country[] COUNTRIES = {
new Country(0),
new Country(1),
new Country(2),
new Country(3)
};
...
// use object array for adapter
ArrayAdapter<Country> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_dropdown_item_1line, COUNTRIES);
mNationAtv.setAdapter(adapter);
mTestBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ArrayAdapter<Country> ada = (ArrayAdapter<Country>) mNationAtv.getAdapter();
int nItems = ada.getCount();
// default Country unknown
Country selItem = new Country(5);
if (nItems > 0) {
selItem = (Country) ada.getItem(0);
}
Log.d(TAG,
"onClick(): nItems=" + nItems + ", selItem.name=" + selItem.toString()
+ ", selItem.id=" + selItem.id);
}
});
...
日志:
当AutocompleteTextView
值与下拉列表中的项目匹配时:
onClick(): nItems=1, selItem.name=Ucraina, selItem.id=2
,当值为空白时:
onClick(): nItems=4, selItem.name=Albania, selItem.id=0
值不为空但与下拉列表中的任何项目都不匹配时:
onClick(): nItems=0, selItem.name=Unknown, selItem.id=5
您可能希望在OnItemClickListener()::onItemClick()
方法中获取此值,该方法通常是用户在下拉菜单中或在其外部单击某个项目(即进行验证)时调用的时间。
答案 2 :(得分:-2)
我把它放在一个简单的例子中,它对我来说正常。见下文:
package com.example.autocompletetv;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
public class AutoCompleteActivity extends ListActivity {
public static final String TAG = AutoCompleteActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auto_complete);
String[] regions = {"One", "Two", "Three", "Four", "Five"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, regions);
this.setListAdapter(adapter);
this.getListView().setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.i(TAG, "postion was " + position);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.auto_complete, menu);
return true;
}
}
当我点击时,我得到:
12-09 19:13:30.617: I/AutoCompleteActivity(1883): postion was 2
12-09 19:13:31.997: I/AutoCompleteActivity(1883): postion was 3
12-09 19:13:34.687: I/AutoCompleteActivity(1883): postion was 4
12-09 19:13:37.028: I/AutoCompleteActivity(1883): postion was 0