BaseAdapter和ArrayAdapter有什么区别?


100

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

我一直在实现自己想要的目标ArrayAdapters

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

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



5
只是已经构建了ArrayAdapter,我们只需要使用它即可。但是BaseAdapter是更通用的适配器,我们需要为其提供实现。(Adapter中的getView(),getcount()等方法)
Pragnani

Answers:


111

区别在于:

  • BaseAdapter是一个非常通用的适配器,可让您执行几乎所有您想做的事情。但是,您必须自己编写一些代码才能使其正常工作。
  • ArrayAdapter是一个更完整的实现,非常适合数组或ArrayLists中的数据。同样,CursorAdapter如果您的数据位于中,则应使用一个相关项Cursor。这些都扩展了BaseAdapter

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

每个工具的性能实际上取决于您如何实现它们或更改其行为。在它们的核心,任何一个都可以同样有效(尤其是考虑到an ArrayAdapter a BaseAdapter)。

您可以使用任何适配器执行几乎任何您想做的事情,但是请记住那BaseAdapter是抽象的,因此您不能直接使用它。


2
提供的默认行为ArrayAdapter(如@ tanis-7x所提及)是TextView列表项内只能有1个,实际上是非常有限的行为。如果每个列表项中都有多个控件,则必须BaseAdapter自己使用和进行作业。当然您仍然可以使用ArrayAdapter,因为它ArrayAdapter是一个BaseAdapter
费利克斯

21

BaseAdapterArrayAdapter扩展时是抽象的BaseAdapter(这是a的具体实现BaseAdapter)。如果您要扩展ArrayAdapter继承所有 ArrayAdapter的功能,并覆盖其实现,则可以修改ArrayAdapter行为。如果扩展 BaseAdapter,则必须实现ArrayAdapter已经实现的所有Abstract方法。

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

不,不是的。

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

如果SDK中的实现能够满足您的需求,那么为什么需要覆盖它并重新发明轮子呢?

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


9

在回答您的3个问题时:

(1)根据Android文档,BaseAdapter只是许多适配器类型的超类,其中一种是ArrayAdapter。有许多其他适配器可以从中得到BaseAdapter满足不同目的的适配器。结果,两者之间的效率存在差异。您只是可以使用各种子类访问一组不同的函数/方法。

(2)您的效率 ArrayAdapter的效率取决于您在该类中所做的工作的效率,即位图和其他数据的处理。

(3)您可能想出了一种ListView使用另一种适配器的工作方式,但是,这样做的原因ArrayAdapter是,鉴于目标是建立一个交互式列表,通常这是有意义的。在ArrayAdapte接受一个Array,通常是一个ArrayList对象,它然后处理以产生用于所述背衬的信息ListView。从这个意义上说,ArrayList-> ArrayAdapter->的设置ListView在逻辑上是有意义的。


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

}

并且不需要像ArrayAdapter中那样在BaseAdapter中指定的DataType。示例:ArrayAdapter <String>
约翰

您也永远不要List<T> UserList;在扩展课程中 使用ArrayAdapter<T>
Selvin

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。


3

BaseAdapters最小且可自定义。ArrayAdapters实现了s的最一般用法ListAdapter,但有时它们还不够。

但是,使用ArrayAdapters 几乎可以实现所有目的。如果您的列表已经可以通过正确使用ArrayAdapter正常工作,那么您从BaseAdapter中将一无所获。

但是,如果要存储ContextArrays或者存储Lists在ArrayAdapter实现中,则可能希望切换到BaseAdapter,因为ArrayAdapter已经实现了它们。

无论如何,如果您这样做,则始终可以删除这些项目,并诉诸于使用getItem()来获取Array项,getCount()获取数组的大小并getContext()扩大视图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.