使用带有 ArrayAdapter<Objects> 而不是 ArrayAdapter<Strings> 的 Android AutoCompleteTextView

Posted

技术标签:

【中文标题】使用带有 ArrayAdapter<Objects> 而不是 ArrayAdapter<Strings> 的 Android AutoCompleteTextView【英文标题】:Using Android AutoCompleteTextView with ArrayAdapter<Objects> instead of ArrayAdapter<Strings> 【发布时间】:2012-10-15 08:33:58 【问题描述】:

我想在我的 android 应用程序中使用 AutoCompleteTextView。我知道如何将它与简单的字符串数组一起使用,但我希望 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 需要一个字符串类型对象的数组来执行搜索操作。在我的情况下,我希望 AutoCompleteTextView 使用我的 ArrayList 来根据学生对象字段 NAME 执行完成。我不知道应该如何指定 AutoCompleteTextView 使用Student 对象的 NAME 字段。请帮助我提供任何链接或小示例。

谢谢

【问题讨论】:

我想我需要自定义 AutoCompleteTextView 并覆盖一些方法.. 【参考方案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();
        
    );
    

    实现自定义适配器(通过扩展BaseAdapter 类或ArrayAdapter&lt;Student&gt; 类)查看本教程:http://www.ezzylearning.com/tutorial.aspx?tid=1763429

【讨论】:

如果我使用 toString() 那么当用户从下拉列表中选择一个项目时,我不会得到对象,而是字符串,然后我必须使用该字符串搜索对象,对吗? 你得到选择的索引。您可以使用它来获取对象。 下拉列表和 AutoCompleteView 的选定索引将使用对象的字符串表示而不是实际对象? 简单易懂:)我看到的最好的例子。 我认为这篇文章以最好的方式回答了这个问题,但是:a) tv.setOnItemClickListener 是干什么用的? b) 如果您使用学生作为提供的适配器,则自动建议框会出现字符串列表。如何在自动建议框中渲染其他东西(例如学生的图像)?【参考方案2】:

您可以使用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));

【讨论】:

这是一个更好的答案,因为您不修改 POJO 以获得视图!【参考方案3】:

如果你想在 String[] 中添加数据 arr=new String[100];那么它错了。 您可以执行与 ArrayList 形式相同的工作,但请记住,您永远不会在此处放置 Getter/Setter 类。只需简单地声明它。请参阅此示例。

在主分区中声明:

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

然后以这种方式初始化它:

 for (int i = 0; i < jsonArray.length(); i++) 
                    JSONObject jsonObject1 = (JSONObject) jsonArray.get(i);
                    String imei = jsonObject1.getString("imei");
                    String name = jsonObject1.getString("name");
                    String my_pic = jsonObject1.getString("my_pic");
                    String email = jsonObject1.getString("email");

                    arr.add(name);
                


                adapter= new ArrayAdapter<>
                        (this, android.R.layout.select_dialog_item, arr);
                autoCompleteText.setThreshold(1);//will start working from first character
                autoCompleteText.setAdapter(adapter);//setting the adapter data into the AutoCompleteTextView
                autoCompleteText.setTextColor(Color.RED);


            

我希望这对你有用....

【讨论】:

【参考方案4】:

您可以在此适配器中覆盖 getItem,依赖于每种类型将其转换为字符串

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

【讨论】:

以上是关于使用带有 ArrayAdapter<Objects> 而不是 ArrayAdapter<Strings> 的 Android AutoCompleteTextView的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ArrayAdapter<myClass>

Android之ArrayAdapter使用

使用android中的自定义arrayadapter在listview中使用复选框检查后如何删除多个项目?

Android ArrayAdapter.Add 方法不起作用

如何使用 HashMap 并在 ArrayAdapter 中使用它来显示微调器中的值

如何修复此 ArrayAdapter 需要资源 ID 为 TextView