使用带有 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<Student>
类)查看本教程: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的主要内容,如果未能解决你的问题,请参考以下文章
使用android中的自定义arrayadapter在listview中使用复选框检查后如何删除多个项目?
Android ArrayAdapter.Add 方法不起作用