AutoCompleteTextView的OnItemClick位置始终为“0”

13

适配器工作正常,但我不明白为什么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;
        }
    });
3个回答

44

不要问我为什么,但是在方法OnItemClickListener.onItemClick中的参数position保存的是相对于AutoCompleteTextView下拉列表的索引,而不是你的适配器数组(在这种情况下是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);
    }
});

2
如果你的 ArrayAdapter 类型是一个对象,那就更好了,你可以使用 Object object = (Object) parent.getItemAtPosition(position); 进行赋值。 - tread
3
如果位置始终为0,这应该如何工作呢?我和原帖作者遇到了同样的问题。 - user535927

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=乌克兰, selItem.id=2

  • 当值为空时:
    onClick(): nItems=4, selItem.name=阿尔巴尼亚, selItem.id=0

  • 当值不为空但不匹配下拉列表中的任何项目时:
    onClick(): nItems=0, selItem.name=未知, selItem.id=5

您可能希望在OnItemClickListener()::onItemClick()方法中获取此值,每次用户单击下拉列表中的项目或其外部时都会调用该方法,即用于验证。


-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

您没有包含完整的代码,但可能是因为regionT不是正确的对象来设置监听器。您是否在使用ListActivity? - David S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接