【问题标题】:How to get text from AutoCompleteTextView?如何从 AutoCompleteTextView 获取文本?
【发布时间】:2011-06-16 17:30:54
【问题描述】:

我的应用中有一个AutoCompleteTextView,它可以工作。我已经成功创建了一个onClickItemListener。问题是如何获取用户选择的文本。

事情就是这样:我有一个ArrayList,其中的单词被传递给Adapter 以搜索建议。当用户键入一个单词时,建议列表会变短(在 UI 端的行中),所以当我想从用户选择的索引处的 ArrayList 获取单词时,我得到了错误的单词,因为索引不匹配.

如何获取用户选择的文本 (String) 而不必弄乱索引?

这是我的代码:

public class AutocompleteActivity extends BaseActivity {

    private DBManager m_db;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.autocomplete);

        m_db = new DBManager(this);
        final ArrayList<String> words = m_db.selectAllWords();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, words);

        AutoCompleteTextView tv = (AutoCompleteTextView)findViewById(R.id.autocomplete);
        tv.setThreshold(1);
        tv.setAdapter(adapter);

        tv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                Log.i("SELECTED TEXT WAS------->", words.get(arg2));
            }
        });
    }
}

【问题讨论】:

  • 感谢您添加此代码 sn-p,它帮助我完成了将近 6 小时的工作。为此 +1
  • 代码有效。给像我这样的初学者的一个小提示,粘贴此代码后,单击该字段并输入一个字母以查看建议框。我确实粘贴了代码,单击了该文件,然后等待弹出的建议框永远不会打开。但是有 showDialogBox() 方法来显示 POPUP。

标签: android android-adapterview


【解决方案1】:

是的......不幸的是,您必须实现的 onItemClick 方法上的参数名称不是那么自描述,但这里有一个示例,其中包含它们的名称:

autoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long rowId) {
        String selection = (String)parent.getItemAtPosition(position);
        //TODO Do something with the selected text
    }
});
  • parent 发生点击的 AdapterView。
  • view 内视图 被点击的 AdapterView(这将是由 适配器)
  • position 视图在适配器中的位置
  • id 被点击项目的行id。

欲了解更多信息,请参阅:http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

【讨论】:

  • 您的建议效果很好,而不是选定的答案。
【解决方案2】:

arg0 是你的AdapterViewarg2 的职位。

你试过了吗:

arg0.getItemAtPosition(arg2);

【讨论】:

  • 我正在寻找用户选择的文本而不是 id
  • arg3 是来自数据库的 ID。我们可以直接使用它
【解决方案3】:

我想你要找的是这个。

String s = this.mCountry.getEditableText().toString();

其中mCountryAutoCompleteTextView

this.mCountry = (AutoCompleteTextView) findViewById(R.id.autocomplete_country);
    ArrayAdapter<String> adapterCountry = new ArrayAdapter<String>(this, R.layout.list_item, countries);
    this.mCountry.setAdapter(adapterCountry);

mCountry是国家列表,我想保存SharedPreferences中选择的国家。

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    最简单的

    要在 AutoCompleteTextView 中获取所选建议的文本,请使用此

          autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.e("========>>", autoCompleteTextView.getText().toString());
            }
        });
    

    【讨论】:

      【解决方案5】:

      试试这个:

      txtPurpose.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      
              @Override
              public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                      long arg3) {
                  Purpose selected = (Purpose) arg0.getAdapter().getItem(arg2);
                  txtPurpose.setTag(selected);
              }
          });
      

      【讨论】:

        【解决方案6】:

        获取AutoCompleteTextView中选择的建议文本的另一个是

        @Override
        public void onItemClick(AdapterView<?> parent, View view,int position, long id) 
        {
            TextView txtvw=(TextView) view;
            String str=txtvw.getText().toString();
            int index = contactNames.indexOf(str);
        } 
        

        【讨论】:

          【解决方案7】:

          这是解决问题的代码。

           private AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
                  int index = (int) view.getTag();
                  Object item = parent.getItemAtPosition(index);
                  if (item instanceof SearchItemShareConnectionDAO) {
                      SearchItemShareConnectionDAO dao = (SearchItemShareConnectionDAO) item;
          
                  }
              }
          };
          

          适配器的getView()方法中的SetTag(Dao.getPosition)。

          【讨论】:

          • 你说得对。这将为我们提供特定的数据。从视图标签:)
          【解决方案8】:

          获取用户选择的显示项的文本

          public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
              String selectedItemText = arg0.getItemAtPosition(arg2);
              Log.i("myTag", "SELECTED TEXT WAS["+selectedItemText+"]);
          }
          

          遵循最佳实践,请为您的变量使用某种形式的描述性命名法,您的代码会更有意义:

          public void onItemClick(AdapterView<?> adapterViewIn, View viewIn, int selectedItemIndexIn, long id) 
          

          【讨论】:

            【解决方案9】:

            还有一种方法可以在onItemClick之外获取物品:

            int index = tv.getListSelection();
            if (index != ListView.INVALID_POSITION) {
                Object item = tv.getAdapter().getItem(index);
            }
            

            请注意,如果没有下拉菜单或没有选择,int getListSelection() 可能会返回 ListView.INVALID_POSITION

            【讨论】:

            • 奇怪,但是index == -1(API 29 模拟器)。
            • @CoolMind 这是可能的,也是预期的行为ListView.INVALID_POSITION = -1
            猜你喜欢
            • 2012-10-23
            • 1970-01-01
            • 2019-04-20
            • 1970-01-01
            • 1970-01-01
            • 2016-07-16
            • 2015-04-05
            • 2012-10-10
            • 2016-10-05
            相关资源
            最近更新 更多