【问题标题】:Selected Item of Autocomplete Textview Show as simple Textview?自动完成文本视图的选定项目显示为简单的文本视图?
【发布时间】:2013-04-05 11:55:21
【问题描述】:

我正在使用自动完成文本视图,它显示数据库中的一些名称。我想在我从自动完成文本视图中选择的文本视图中显示一个名称。这是我的代码:

ArrayList<String> s1 = new ArrayList<String>();

      for (StudentInfo cn : studentInfo) {
            s1.add(cn.getName());
        }
        ArrayAdapter<String> adapter =  new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,s1); 
       a1.setThreshold(1); 
        a1.setAdapter(adapter);

a1.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
    }
        });

【问题讨论】:

  • 代码中的 a1 是什么,您想在 textview 或 edittext 中拍摄所选项目???
  • a1 是自动完成文本视图,我想在文本视图中显示所选项目。
  • 在自动完成文本视图中选择项目时,它会自动在自动完成文本视图中设置。无需为此使用额外的方法。在这里查看:dj-android.blogspot.in/2013/04/…

标签: java android android-edittext autocompletetextview onitemclicklistener


【解决方案1】:

试试这个方法:

AutoCompleteTextView a1 = (AutoCompleteTextView) findViewById(...);

StudentInfo[] s1 = studentInfo.toArray(new StudentInfo[studentInfo.size()]);

ArrayAdapter<StudentInfo> adapter = new ArrayAdapter<StudentInfo>(this, android.R.layout.simple_dropdown_item_1line, s1);
a1.setAdapter(adapter);
a1.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) {
        Object item = parent.getItemAtPosition(position);
        if (item instanceof StudentInfo){
        StudentInfo student=(StudentInfo) item;
            doSomethingWith(student);
        }
    }
});

ArrayAdapter 使用 StudentInfo 的 toString() 方法来生成显示的文本,所以需要实现一个不错的 toString 方法。

这样,这种实现可以适应任何对象类型。

顺便说一句:我更喜欢 android.R.layout.simple_spinner_dropdown_item 而不是 android.R.layout.simple_dropdown_item_1line

【讨论】:

  • 它没有显示下拉菜单,你能帮帮我吗。
  • parent.getItemAtPosition(position);它给出的列表位置,所以位置与原始数据不匹配,它没有给出期望的输出
  • @Shivang 是对的。真正的解决方案在这里:spapas.github.io/2019/04/05/android-custom-filter-adapter。您需要公开 FilterResult 值。
  • 不,parent.getItemAtPosition(position) 适用于过滤列表。我查过了。
  • android.R.layout.simple_spinner_dropdown_item 与 android.R.layout.simple_dropdown_item_1line 有何不同?
【解决方案2】:

感谢斯蒂芬·里希特!我想补充一点,在构建适配器时可以直接使用List&lt;T&gt;

AutoCompleteTextView autoCompleteTextView = dialogView.findViewById(R.id.autoComplete);
            // Where mStudentsInfo is List<StudentInfo>
            ArrayAdapter<StudentInfo> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, mStudentsInfo);
            autoCompleteTextView.setAdapter(adapter);
            autoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Object item = parent.getItemAtPosition(position);
                    if (item instanceof StudentInfo) {
                        StudentInfo studentInfo = (StudentInfo) item;
                        // do something with the studentInfo object
                    }
                }
            });

并且不要忘记覆盖StudentInfo.class中的toString()方法:

public class StudentInfo {

....

    @Override
    public String toString() {
        return studentName;
    }
}

【讨论】:

  • item instanceof StudentInfo 可以是假的吗? ArrayAdapter&lt;StudentInfo&gt; 将所有项目设置为 StudentInfo
  • @CoolMind,我总是在施法前检查。总是! :)
  • 相信你,但是获得item 不是StudentInfo 的实例的条件是什么?
【解决方案3】:

覆盖模型类的 toString 方法(在本例中为 StudenInfo)不是一个好主意!
如果您只想获取所选项目的文本,请使用以下代码:

 autoCompleteView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String selectedItem = (String) parent.getItemAtPosition(position);
                // here is your selected item
            }
        });

【讨论】:

    【解决方案4】:

    从视图对象arg1获取String的值。从提供给 AutoCompleteTextView 的 ArrayList 中使用此字符串获取项目的位置。

    在您的情况下,代码如下所示。

    int selectedPos = s1.indexOf((String) ((TextView) arg1).getText());
    

    selectedPos 是字符串在提供的 ArrayList 中的位置。

    【讨论】:

      【解决方案5】:

      您的s1 包含来自database 的所有名称

      a1.setOnItemClickListener(new OnItemClickListener() {
      
                  @Override
                  public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                          long arg3) {
                  Log.d("your selected item",""+s1.get(position));
                  //s1.get(position) is name selected from autocompletetextview
                  // now you can show the value on textview. 
          }
              });
      

      希望对你有帮助,

      【讨论】:

      • 注意!在此示例中,位置参数不是 s1 中的位置,它是选择时自动完成显示的任何内容的索引。
      【解决方案6】:

      从使用用户定义的数据类型并设置相关列表的值的自动完成选择中获取选定的项目。以下代码对我有用

      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position,
      long arg3) {
          int selectedPos = getYourList().indexOf((((TextView)view).getText()).toString());
          SomeDAO dao = getSomeDaoList().get(selectedPos);
          //do your code
      }
      

      注意:我已将 onItemClick 中的默认参数名称更改为 arg0-parent、arg1-view、arg2-position & SomeDAO 是用户定义的数据类型

      【讨论】:

        【解决方案7】:

        使用父位置为'0'

          txt_search.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View arg1, int position, long id) {
                    Object item = parent.getItemAtPosition(0);
                    if (item instanceof MYData{
                        MYData data=(MYData) item;
                        String dd = data.getName();
                    }
                }
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多