BaseAdapter和ArrayAdapter有什么区别?

Chi*_*oni 99 performance android listview android-arrayadapter baseadapter

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

我一直在实现我想要的东西ArrayAdapters.

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

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

Tan*_*.7x 110

这是区别:

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

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

每个人的表现实际上取决于你如何实施或改变他们的行为.在它们的核心,任何一个都可以同样有效(特别是考虑到a ArrayAdapter a BaseAdapter).

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

  • "ArrayAdapter"提供的默认行为(如@ tanis-7x所述)是列表项中只能有1个`TextView`,实际上行为非常有限.如果每个列表项中有多个控件,则必须自己使用"BaseAdapter"和作业.当然你仍然可以使用`ArrayAdapter`,因为`ArrayAdapter`是一个`BaseAdapter`. (2认同)

Bla*_*elt 20

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

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

不,不是的.

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

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

它们之间的主要区别是BaseAdapter 不能被实例化,同时ArrayAdapter


Rar*_*arw 9

回答你的3个问题:

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

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

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


Joh*_*ohn 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;
   }

}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)


Ami*_*dav 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);
Run Code Online (Sandbox Code Playgroud)

这里我们不能像ArrayAdapter一样使用BaseAdapter.