我想知道使用BaseAdapter
和ArrayAdapter
的区别。
我一直通过ArrayAdapters
实现我的目标。
在实现适配器界面中,它会影响ListView
的性能吗?
最后一个问题是,我是否可以使用任何一个这些Adapters
来实现与ListView
相关的任何操作,或者只有特定的适配器才能使用?
我想知道使用BaseAdapter
和ArrayAdapter
的区别。
我一直通过ArrayAdapters
实现我的目标。
在实现适配器界面中,它会影响ListView
的性能吗?
最后一个问题是,我是否可以使用任何一个这些Adapters
来实现与ListView
相关的任何操作,或者只有特定的适配器才能使用?
这里的区别:
BaseAdapter
是一个非常通用的适配器,允许你做几乎任何想做的事情。然而,为了使其工作,你需要自己编写更多的代码。ArrayAdapter
是一个更完整的实现,适用于数组或 ArrayList
中的数据。类似地,还有一个相关的 CursorAdapter
,如果你的数据在 Cursor
中,应该使用它。它们都扩展了 BaseAdapter
。如果你的数据是某种特殊集合中的数据,或者你不想要 ArrayAdapter
提供的默认行为,你可能需要扩展 BaseAdapter
以获取所需的灵活性。
它们的表现实际上取决于你如何实现它们或改变它们的行为。从本质上讲,任何一个都可以同样有效(尤其是考虑到一个 ArrayAdapter
实际上就是一个 BaseAdapter
)。
你可以使用任何适配器来做几乎任何想做的事情,但请记住 BaseAdapter
是抽象的,因此不能直接使用它。
ArrayAdapter
默认提供的行为(如@tanis-7x所述)是列表项中只能有一个TextView
,实际上这种行为非常有限。如果每个列表项中有多个控件,则必须使用BaseAdapter
并自己完成工作。当然,你仍然可以使用ArrayAdapter
,因为ArrayAdapter
是一个BaseAdapter
。 - FelixBaseAdapter
是抽象的,而ArrayAdapter
扩展了BaseAdapter
(它是BaseAdapter
的一个具体实现)。如果您扩展ArrayAdapter
,则继承了所有ArrayAdapter
的功能,并且,通过覆盖其实现,可以修改ArrayAdapter
的行为。如果您扩展BaseAdapter
,则必须实现所有抽象方法,这些方法已经被ArrayAdapter
实现。
另外,这会影响ListView的性能吗?
不会。
最后一个问题是,我可以使用这些适配器中的任何一个来完成ListView的任何操作,还是只有特定的适配器才能使用?
如果SDK中提供的实现满足您的需求,为什么需要重写它并重新发明轮子呢?
它们之间的主要区别在于BaseAdapter
不能被实例化,而ArrayAdapter
可以。
回答您的三个问题:
(1) 根据Android文档,BaseAdapter只是许多适配器类型的超类之一,其中之一是ArrayAdapter
。还有许多其他从BaseAdapter
派生出来的适配器,适用于不同的目的。因此,两者之间的效率差异不大;使用各种子类可以访问不同的函数/方法。
(2) ArrayAdapter
的效率取决于类内部正在进行的处理,即位图和其他数据的处理。
(3) 您可能可以想出一种使用不同类型适配器的ListView
的方法,但是ArrayAdapter
有效的原因是因为构建交互式列表是有意义的。 ArrayAdapter
接受一个Array
,通常是对象的ArrayList
,然后处理它以创建ListView
的后备信息。在这个意义上,设置ArrayList
--> ArrayAdapter
--> ListView
在逻辑上是有意义的。
BaseAdapter和ArrayAdapter之间的另一个区别是,如果你扩展ArrayAdapter,则必须在子类构造函数中调用超类构造函数。
UserListAdapter extends ArrayAdapter<String>{
List<String> UserList;
Context context;
public UserListAdapter(Context context, int resource,List<String> listUsers) {
super(context, resource, listUsers); /* Super class constructor is called */
UserList = listUsers;
this.context = context;
}
}
但是BaseAdapter没有超类。由于BaseAdapter作为所有其他适配器的超类,它不需要超类。
UserListAdapter extends BaseAdapter{
List<String> UserList;
Context context;
public UserListAdapter(Context context, int resource,List<String> listUsers) {
/* No super class constructor */
UserList = listUsers;
this.context = context;
}
}
ArrayAdapter<T>
的类中,也不应该使用List<T> UserList;
。 - Selvinprivate static final String[] COUNTRIES = new String[]{
"Afghanistan", "Angola", "Australia", "Bangladesh", "Belgium",
"Bhutan", "Brazil", "Canada", "China", "Denmark"
};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list);
textView.setAdapter(adapter);
在这里,我们不能像使用ArrayAdapter一样使用BaseAdapter。
BaseAdapter
更加简约和可定制。 ArrayAdapter
实现了ListAdapter
的最一般用途,但有时它们不够用。
然而,几乎所有的事情都可以通过使用ArrayAdapter
来实现。如果您的列表已经通过正确使用ArrayAdapter
进行工作,那么您将无法从BaseAdapter
中获得任何好处。
但是,如果您在ArrayAdapter
实现中存储了您的Context
、Arrays
或Lists
,也许您会想切换到BaseAdapter
,因为ArrayAdapter
已经实现了它们。
无论如何,如果您这样做了,您总是可以删除这些项目,并采用getItem()
来获取数组项,getCount()
来获取数组大小,以及getContext()
来填充您的视图。