101

我想知道使用BaseAdapter和之间的区别ArrayAdapter

我一直在通过ArrayAdapters.

它会影响ListView实现它的适配器接口的性能吗?

ListView而且,最后一个问题是,我可以使用其中任何一个来实现任何事情Adapters,或者在某些情况下只能使用特定的适配器?

4

6 回答 6

112

这是区别:

  • BaseAdapter是一个非常通用的适配器,可以让你做几乎任何你想做的事情。但是,您必须自己进行更多编码才能使其正常工作。
  • ArrayAdapter是一个更完整的实现,适用于数组或ArrayLists 中的数据。同样,CursorAdapter如果您的数据位于Cursor. 这两个扩展BaseAdapter

如果您的数据位于某种专门的集合中,或者您不想要ArrayAdapter提供的默认行为,您可能需要扩展BaseAdapter以获得所需的灵活性。

每个的性能实际上取决于您如何实现它们或改变它们的行为。在它们的核心,任何一个都可以同样有效(特别是考虑到 anArrayAdapter a BaseAdapter)。

你可以用任何适配器做几乎任何你想做的事情,但请记住这BaseAdapter是抽象的,所以你不能直接使用它。

于 2013-05-28T15:50:13.963 回答
22

BaseAdapter是抽象的,而ArrayAdapterextends BaseAdapter(它是 a 的具体实现BaseAdapter)。如果你为你扩展ArrayAdapter继承所有 ArrayAdapter的特性,并且覆盖它的实现,你可以修改ArrayAdapter行为。如果您扩展 BaseAdapter,您必须实现所有抽象方法,即 ArrayAdapter 已经实现。

另外,它是否会影响 ListView 的性能

不,不是的。

而且,最后一个问题是,我可以使用这些适配器中的任何一个来实现使用 ListView 做的任何事情,或者在某些情况下只能使用特定的适配器吗?

如果 SDK 中的实现满足您的需求,为什么您需要重写它并重新发明轮子?

它们之间的主要区别是BaseAdapter 不能实例化而ArrayAdapter可以

于 2013-05-28T15:51:31.470 回答
9

回答您的3个问题:

(1)根据 Android 文档, BaseAdapter只是许多适配器类型的超类,其中之一是ArrayAdapter. 还有许多其他适配器派生自BaseAdapter适合不同目的的适配器。因此,两者之间的效率不可能有任何差异。您只需使用各种子类访问一组不同的函数/方法。

(2) 你的效率ArrayAdapter取决于你在那个类中所做的事情的效率,即处理位图和其他数据。

(3) 您可能会想出一种方法来ListView使用不同类型的适配器,但是,之所以ArrayAdapter有效,是因为它通常是有意义的,因为目标是构建一个交互式列表。ArrayAdapte接受一个Array,通常是一个对象,然后处理这些ArrayList对象以创建ListView. 从这个意义上说,ArrayList--> ArrayAdapter-->的设置ListView在逻辑上是有意义的。

于 2013-05-28T15:57:18.607 回答
7

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;
   }

}
于 2015-03-10T08:51:14.783 回答
6
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。

于 2014-09-30T13:41:40.857 回答
3

BaseAdapters 更加简约和可定制。ArrayAdapters 实现了 s 的最一般用途ListAdapter,但有时它们还不够。

但是,几乎所有事情都可以通过使用ArrayAdapters 来实现。如果您的列表已经通过正确使用 ArrayAdapter 正常工作,那么您将无法从 BaseAdapter 获得任何收益。

但是,如果您正在存储您的Context,ArraysLists在您的 ArrayAdapter 实现中,也许您会想要切换到BaseAdapter,因为ArrayAdapter它们已经实现了。

无论如何,如果你这样做,你总是可以删除这些项目,并诉诸使用getItem()来获取数组项目,getCount()获取数组的大小,并getContext()膨胀你的视图。

于 2013-05-28T15:49:25.727 回答