BaseAdapter和ArrayAdapter有什么区别?
我想知道使用BaseAdapter
和ArrayAdapter
之间的区别。
我一直通过ArrayAdapters
实现我想要的。
它是否会影响实现它的适配器接口上的ListView
的性能?
而且,最后一个问题是,我可以通过使用任何这些Adapters
来实现对ListView
任何操作,或者在某些情况下只能使用特定的适配器?
以下是区别:
-
BaseAdapter
是一个非常通用的适配器,可以让你做任何你想做的事情。 但是,你必须做更多的编码来让它工作。 -
ArrayAdapter
是一个更完整的实现,可以很好地处理数组或ArrayList
的数据。 同样,如果数据在Cursor
则应该使用相关的CursorAdapter
。 这两个扩展BaseAdapter
。
如果您的数据是某种特定的集合,或者您不希望ArrayAdapter
提供的默认行为,那么您可能需要扩展BaseAdapter
以获得所需的灵活性。
每个人的performance确实取决于你如何实施他们或改变他们的行为。 在他们的核心,任何一个可以一样有效(特别是考虑到ArrayAdapter
是一个BaseAdapter
)。
你可以用任何适配器来做任何你想做的事情,但是请记住, BaseAdapter
是抽象的,所以你不能直接使用它。
BaseAdapter
是抽象的,而ArrayAdapter
扩展了BaseAdapter
(它是一个BaseAdapter
的具体实现)。 如果你扩展了ArrayAdapter
你可以插入所有ArrayAdapter
的特性,并且覆盖它的实现,你可以修改ArrayAdapter
beahviour。 如果扩展BaseAdapter
,则必须实现ArrayAdapter已经实现的所有Abstract方法。
此外,它是否影响ListView的性能
不,不是的。
而且,最后一个问题是,我可以通过使用任何这些适配器来实现对ListView的任何操作,或者在某些情况下只能使用特定的适配器?
如果在SDK中的实现满足您的需求,为什么你需要覆盖它并重新发明轮子?
它们之间的主要区别在于BaseAdapter
不能在ArrayAdapter
可以安装的情况下安装
回答你的3个问题:
(1)根据Android文档, BaseAdapter只是一些适配器types的超类,其中之一是ArrayAdapter
。 还有一些从BaseAdapter
派生的其他适配器适合不同的用途。 因此,这两者之间效率上的差异是不明智的。 你只需要使用不同的子类访问一组不同的函数/方法。
(2)你的ArrayAdapter
的效率取决于你在这个类中做什么的效率,即处理位图和其他数据。
(3)你可能会想出一种方法来使用不同types的适配器来处理你的ListView
,然而, ArrayAdapter
工作原因是因为它的目标是build立一个交互式列表。 ArrayAdapte
接受一个Array
(通常是一个ArrayList
对象),然后处理它以创buildListView
的支持信息。 从这个意义上说, ArrayList
– > ArrayAdapter
– > ListView
在逻辑上是合理的。
BaseAdapter和ArrayAdapters之间的另一个区别是,如果扩展数组适配器,则必须在子类构造函数中调用超类构造函数。
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; } }
BaseAdapter
更加简单和可定制。 ArrayAdapter
实现了ListAdapter
的最常用的ListAdapter
,但有时它们还不够。
但是,几乎所有的东西都可以通过使用ArrayAdapter
来实现。 如果您的列表已经通过正确使用ArrayAdapter工作,那么您无法从BaseAdapter中获得任何信息。
但是,如果您在ArrayAdapter实现中存储Context
, Arrays
或Lists
,则可能需要切换到BaseAdapter
,因为ArrayAdapter
已经实现了它们。
无论如何,如果你这样做,你总是可以删除这些项目,并诉诸使用getItem()
获取数组项, getCount()
获取数组的大小和getContext()
来膨胀你的意见。
private 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。