使用ArrayAdapter<Objects>代替ArrayAdapter<Strings>来与Android AutoCompleteTextView一起使用

32

我想在我的安卓应用程序中使用AutoCompleteTextView控件。我知道如何使用简单的字符串数组,但是我想要使用对象列表来实现自动完成功能。以下是我编写的代码:

活动代码

public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search);

        initialize();
        ArrayAdapter<Student> adapter = new ArrayAdapter<Student>(this,
                R.layout.dropdown_list_item, GetAllStudentsList());

        searchBox.setAdapter(adapter);
        searchBox.setThreshold(THRESHOLD_VALUE);
        searchBox.setTextColor(Color.BLACK);
}

searchBox.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view,
                int position, long arg3) {
                     //Here i will grab the Student object that user selected from drop-down

        }

    });

public ArrayList<Movies> GetAllStudentsList() {

//This method returns a ArrayList of <Student> type objects
}

Student类对象包含有关学生的信息,其中包括ID, NAME, ADDRESS, MARKS

我知道AutoCompleteTextView需要一个String类型数组对象来执行搜索操作。在我的情况下,我希望AutoCompleteTextView使用我的ArrayList根据Student对象字段NAME执行完成操作。我不知道如何指定AutoCompleteTextView使用Student对象的NAME字段。请帮助我提供任何链接或一个简单的示例。

谢谢


我想我需要创建自定义的AutoCompleteTextView并重写一些方法。 - Anshul
3个回答

93

两种方法:

  1. Student类中覆盖toString()方法,并使其返回name。您可以使用以下代码获取所选对象:

     public static class Student {
    
        private String name;
    
            public Student(String name) {
                this.name = name;
            }
    
            @Override
            public String toString() {
                return name;
            }
    
        }
    
    AutoCompleteTextView tv = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
    final ArrayList<Student> list = new ArrayList<MainActivity.Student>();
    list.add(new Student("Viru"));
    list.add(new Student("Gauti"));
    ArrayAdapter<Student> adapter = new ArrayAdapter<MainActivity.Student>(
            this, android.R.layout.simple_dropdown_item_1line, list);
    tv.setAdapter(adapter);
    
    tv.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            Student selected = (Student) arg0.getAdapter().getItem(arg2);
            Toast.makeText(MainActivity.this,
                    "Clicked " + arg2 + " name: " + selected.name,
                    Toast.LENGTH_SHORT).show();
        }
    });
    
  2. 实现一个自定义适配器(通过扩展BaseAdapter类或ArrayAdapter<Student>类)。查看此教程:http://www.ezzylearning.com/tutorial.aspx?tid=1763429


如果我使用toString(),那么当用户从下拉列表中选择一个项目时,我将不会得到对象,而是得到字符串,然后我需要使用该字符串搜索对象,对吗? - Anshul
1
您可以获取所选索引,然后使用它来获取对象。 - Sameer
下拉列表和自动完成视图的选定索引将使用对象的字符串表示而不是实际对象? - Anshul
我看到的最好的例子。 - narb
我认为这篇文章以最佳方式回答了问题,但是:a)tv.setOnItemClickListener是什么?b)如果您像所示那样使用Students作为适配器,则自动建议框将显示带有字符串列表的列表。如何在自动建议框中呈现其他内容(例如学生的图像)? - mercury0114
这是 toString() 方法!! 谢谢奶酪的帮助。 - Cheese Bread

8
您可以使用 AbstractList 获取对象列表中每个项目的 String 表示。
private void setupAutoComplete(AutoCompleteTextView view, List<T> objects) {
    List<String> names = new AbstractList<String>() {
        @Override
        public int size() { return objects.size(); }

        @Override
        public String get(int location) {
            return objects.get(location).getName();
        }
    };

    view.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names));
}

2
这是一个更好的答案,因为您不需要修改POJO以用于视图! - Susanta

0

您可以在此适配器中重写getItem方法,根据每种类型将其转换为字符串。

 override fun getItem(position: Int): String? {
        val item = listData[position]
        when (item) {
            is BankItem -> {
                return item.bankName
            }
        ....
 }

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