BaseAdapter和ArrayAdapter有什么区别?

我想知道使用BaseAdapterArrayAdapter之间的区别。

我一直通过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实现中存储ContextArraysLists ,则可能需要切换到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。