自动完成文本视图的选定项显示为简单文本视图?

19
我正在使用一个自动完成的文本视图,它从数据库中显示一些名称。我想在一个文本视图中显示我从自动完成文本视图中选择的名称。以下是我的代码:
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中选择的项目? - Dhaval Parmar
a1 是自动完成的文本视图,我想在文本视图中显示所选项目。 - bhoot4242
在自动完成文本视图中,当您选择项目时,它会自动设置在自动完成文本视图中。不需要为此实现额外的方法。在这里查看:http://dj-android.blogspot.in/2013/04/android-autocompletetextview-inside.html - Dhaval Parmar
7个回答

31

试着用这种方法:

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


它没有显示下拉菜单,你能帮我解决一下吗? - Shivang
2
parent.getItemAtPosition(position); 它给出的是显示列表的位置,因此该位置与原始数据不匹配,它没有给出所需的输出。 - Shivang
@Shivang是正确的。真正的解决方案在这里:https://spapas.github.io/2019/04/05/android-custom-filter-adapter/。您需要公开FilterResult值。 - Susanta
不,parent.getItemAtPosition(position) 对于筛选后的列表也能正常工作。我已经验证过了。 - CoolMind
android.R.layout.simple_spinner_dropdown_item和android.R.layout.simple_dropdown_item_1line有什么区别? - CoolMind
我有两个自动完成输入框,如果我选择了id,则下一个自动完成输入框中需要自动设置该id对应的值。{response: [{id: '', value: ''}, {id: '', value: ''}]} - sejn

11

感谢Stefan Richter!我想补充一下,当您构建适配器时,可以直接使用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
                    }
                }
            });

同时,不要忘记在StudentInfo.class中重写toString()方法:

public class StudentInfo {

....

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

item instanceof StudentInfo可能为假吗?ArrayAdapter<StudentInfo>将所有的项都设置为StudentInfo - CoolMind
@CoolMind,我总是在转换之前进行检查。总是! :) - Ivo Stoyanov
我相信你,但是获取item不是StudentInfo实例的条件是什么? - CoolMind

4

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

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

3

您的s1包含来自数据库的所有名称。

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

希望这能帮到你,

8
注意!在这个例子中,位置参数不是指s1中的位置,它是自动完成在选择时显示的索引。 - Anti Veeranna

3
从视图对象arg1中获取字符串的值。从提供给AutoCompleteTextView的ArrayList中使用此字符串获取项目的位置。
在您的情况下,代码应如下所示。
int selectedPos = s1.indexOf((String) ((TextView) arg1).getText());

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


2

以下代码适用于从使用用户定义数据类型并设置相关列表的自动完成选择中获取所选项:

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

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

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