17

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

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) {
    }
        });
4

7 回答 7

28

试试这种方式:

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

于 2015-10-01T13:30:04.620 回答
11

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

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
                    }
                }
            });

并且不要忘记覆盖以下toString()方法StudentInfo.class

public class StudentInfo {

....

    @Override
    public String toString() {
        return studentName;
    }
}
于 2017-12-21T11:27:49.997 回答
4

模型类的覆盖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
            }
        });
于 2016-07-14T20:06:39.773 回答
3

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

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

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

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

于 2014-04-29T09:00:46.030 回答
2

你的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. 
    }
        });

希望这会帮助你,

于 2013-04-05T12:16:10.787 回答
1

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

@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 是用户定义的数据类型

于 2014-06-23T11:06:28.273 回答
1

使用父位置为 '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();
            }
        }
    });
于 2017-07-08T08:52:59.517 回答