AutoCompleteTextView OnItemClick位置始终为“0”

时间:2013-12-09 18:51:21

标签: android autocomplete

适配器工作正常,但我不明白为什么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 个答案:

答案 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