BaseAdapter和ArrayAdapter有什么区别?

时间:2013-05-28 15:43:35

标签: android performance listview android-arrayadapter baseadapter

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

我通过ArrayAdapters实现了我想要的目标。

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

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

6 个答案:

答案 0 :(得分:108)

区别在于:

  • BaseAdapter是一个非常通用的适配器,可以让你做任何你想做的事情。但是,您必须自己做一些编码才能使其正常工作。
  • ArrayAdapter是一个更完整的实现,适用于数组或ArrayList中的数据。同样,如果您的数据位于CursorAdapter,则应使用相关的Cursor。这两个都延伸BaseAdapter

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

每个人的表现实际上取决于你如何实施或改变他们的行为。从根本上说,任何一个都可以同样有效(特别是考虑到ArrayAdapter BaseAdapter)。

您可以使用任何适配器执行任何操作,但请记住BaseAdapter是抽象的,因此您无法直接使用它。

答案 1 :(得分:19)

BaseAdapter是抽象的,ArrayAdapter扩展BaseAdapter(它是BaseAdapter的具体实现)。如果您延伸到ArrayAdapter,那么您将继承所有ArrayAdapter的功能,并覆盖其实现,您可以修改ArrayAdapter行为。如果扩展BaseAdapter,则必须实现ArrayAdapter已实现的所有Abstract方法。

  

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

不,不。

  

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

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

它们之间的主要区别在于BaseAdapter无法实例化,ArrayAdapter可以

答案 2 :(得分:9)

回答你的3个问题:

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

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

(3)您可能想出一种使用不同类型的适配器来处理ListView的方法,但是,ArrayAdapter的工作原因是因为它通常是有意义的,因为目标是构建交互式列表。 ArrayAdapte需要一个Array,通常是ArrayList个对象,然后它会处理以创建ListView的支持信息。在这个意义上,ArrayList - >的设置ArrayAdapter - > ListView只是逻辑上有道理。

答案 3 :(得分:6)

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

}

答案 4 :(得分:5)

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。

答案 5 :(得分:3)

BaseAdapter更小,可自定义。 ArrayAdapter实现ListAdapter s的最常用用途,但有时它们还不够。

然而,几乎所有事情都可以通过ArrayAdapter来实现。如果您的列表已经正确使用ArrayAdapter,则无法从BaseAdapter获得任何好处。

但是,如果您要将ContextArraysLists存储在ArrayAdapter实现中,那么您可能希望切换到BaseAdapter,{{1已经实现了它们。

无论如何,如果您这样做,您可以随时删除这些项目,并使用ArrayAdapter获取数组项,getItem()以获取数组的大小,并{{ 1}}来夸大你的观点。